//argv[0] == (argv + 0), *(argv + 0), or (*argv + 0)?
Ну вот как *(argv + 0)
и (*argv + 0)
оба эквивалентны argv[0]
. Это можно легко узнать, распечатав вывод. Вы можете сделать что-то вроде этого:
char** argv = malloc(2*sizeof(char*));
for(int i = 0; i < 2; i++){
argv[i] = malloc(1);
}
//printing the values:
printf("%p == %p\n", argv[0], argv + 0);
printf("%p == %p\n", argv[0], *(argv + 0));
printf("%p == %p\n", argv[0], *argv + 0);
выход:
0x8e84018 == 0x8e84008 //not equal
0x8e84018 == 0x8e84018 //same
0x8e84018 == 0x8e84018 //same
смотрите здесь полный пример: https://ideone.com/DDXuI9
это не верно в случае (argv + 0)
потому, что (argv + 0)
указывает на адрес самого char** argv
, тогда как argv[0]
указывает на адрес первого элемента (который относится к типу char*
)
Ваш второй комментарий является правильным и содержит ответ на первый. Предполагая, конечно, что ваш код имеет дополнительные вызовы 'malloc' для инициализации двух указателей, которые вы выделили первым вызовом' malloc'. – user3386109
Не могли бы вы помочь мне понять, почему мне нужно дважды malloc? Итак, если я malloc для char ** argv, этого недостаточно для char * argv? Мне также нужно malloc для char * argv? –
'argv + 0' эквивалентно' argv' (очевидно). '* argv + 0' эквивалентно' * argv' (также obviosly). 'argv' не эквивалентен' * argv' (очень очевидно). –