Проблема заключается в следующем. Я хочу быть в состоянии создать мой argv с использованием записи массива:
char myargv[10][30];
однако основные функции ожидают ** char, несмотря на то, что они могут обрабатывать их одинаково логически.
int main(int argc, char **argv)
{
printf("%s\n",argv[0]);
return 0;
}
Однако попытка следующего внутри моего кода не будет работать:
char myargv[10][30];
char **pargv = myargv;
Может кто-нибудь уточнить? Я также пробовал некоторые другие перестановки, такие как, pargv = myargv [0] [0] и т. Д., Но безуспешно.
РЕДАКТИРОВАТЬ:
Если это окажется невозможным, как я обрисовал в общих чертах, может кто-нибудь помочь мне инициализировать char ** myargv с помощью вызова malloc, чтобы он содержал 10 строк по 40 символов. У меня проблемы с получением правильного синтаксиса.
это не сработает
char **pargv = &myargv[0][0];
Причиной этого является то, что когда вы пытаетесь получить доступ / напечатать pargv [1], он не знает, сколько байтов пропустить с начальной позиции.
вместо этого вы должны написать так.
char (*pargv)[30] = &myargv[0][0]; \\we have created a pointer to a charater array of size 30
Смотрите сейчас, если вы пытаетесь получить доступ к pargv [1], компилятор знает, что ему нужно прыгнуть на 30 байтов, чтобы получить доступ к местоположению.
даже если это возможно, люди идут с динамическим распределением, поскольку это ясно и понятно.
следующий код должен работать.
char ** pargv;
pargv = (char **)malloc(10*sizeof(char *));
for(int i=0;i<10;i++)
{
pargv[i]=(char *)malloc(30*sizeof(char));
}
приведенный выше код работает следующим образом.
окончательно, вы создали 10 массивов символов.
теперь вы можете получить доступ к pargv точно так же, как и к char pargv [10] [30];
char myargv[10][30];
char **pargv1 = myargv; // Error, in an expression array is converted to pointer
char (*pargv2)[30] = myargv; // OK, pointer to an array 30 of char
pargv1
это указатель на указатель на char
,
myargv
это массив массивов char
, При оценке он преобразуется в указатель на массив 30
из char
,
Это не работает, потому что myargv
это не указатель, это массив. Кроме того, преобразование lvalue в rvalue не применяется с присваиванием.
Если вы ищете простой способ объявить argv и не зацикливаетесь на идее, что argv — это массив с двумя измерениями (это не так, это массив с указателями одного измерения), тогда
char* argv[] = {
"one", "two", "three", "four", 0};
будет работать (игнорируя постоянные проблемы)