Работа с массивами C, переход к execv()

У меня есть функция:

int exploreDIR (char stringDIR[], char arguments[6][100])
{    
     /*stuff...*/
     execv(filePath, arguments); 
}

Однако я получаю warning: passing argument 2 of ‘execv’ from incompatible pointer type

Если execv ожидает char* const argv[] в качестве второго аргумента, почему я получаю это предупреждение?

Поскольку массивы — это, по сути, то же самое, что и указатели на начало массива, в чем здесь критическая разница между char arguments[][] и char* const argv[]?


person Dan Brenner    schedule 15.10.2013    source источник
comment
Нет ошибок в execv(filePath, arguments); , arguments должно быть завершено NULL, но arguments[6][100] не может быть завершено NULL, поскольку arguments[i] является допустимым адресом! = NULL   -  person Grijesh Chauhan    schedule 15.10.2013
comment
Я в замешательстве, какое здесь решение? Я думал, что, создавая аргументы размером 6 (из которых я когда-либо планировал заполнить только 5 из них), последнее значение будет указателем NULL и, таким образом, вызовет завершение. Это неправильно?   -  person Dan Brenner    schedule 15.10.2013
comment
Прочтите: Разница между char* str[] и char str[][] и как они хранятся в памяти?   -  person Grijesh Chauhan    schedule 15.10.2013
comment
даже если вы заполните только первые пять аргументов (из argument[0]....argument[4] ), даже тогда argument[5] не равно NULL, это будет действительный адрес с strlen = 0, прочитайте ответ, который я связал.   -  person Grijesh Chauhan    schedule 15.10.2013


Ответы (2)


Вы передаете указатель (*), который выглядит так:

*
`-> aaaa...aaaabbbb...bbbbcccc...cccc

Он указывает на память, содержащую несколько массивов char[100].

Функция ожидает аргумент, выглядящий следующим образом:

*
`->***
   ||`-> cccc...cccc
   |`-> bbbb...bbbb
   `-> aaaa...aaaa

Ему нужен указатель, указывающий на память, содержащую несколько char*.

Эти два типа различны и не могут быть преобразованы автоматически.

person sth    schedule 15.10.2013

char arguments[6][100] — это 600-байтовый фрагмент памяти, разделенный на 6 сегментов по 100 байт, тогда как char* argv[] — это массив указателей на сегменты памяти, которые могут быть где угодно. Один из способов увидеть разницу: arguments[i+1] - arguments[i] будет 100, а argv[i+1] - argv[i] может быть ЛЮБЫМ.

person Scott Hunter    schedule 15.10.2013