Назначение указателя на указатель символов на матрицу символов в C

Проблема заключается в следующем. Я хочу быть в состоянии создать мой 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 символов. У меня проблемы с получением правильного синтаксиса.

1

Решение

это не сработает
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 указателей charater (которые будут указывать на массив символов);
  • затем для каждого указателя символов он выделяет 30 байтов памяти (массив символов из 30 байтов).

окончательно, вы создали 10 массивов символов.
теперь вы можете получить доступ к pargv точно так же, как и к char pargv [10] [30];

1

Другие решения

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,

0

Это не работает, потому что myargv это не указатель, это массив. Кроме того, преобразование lvalue в rvalue не применяется с присваиванием.

0

Если вы ищете простой способ объявить argv и не зацикливаетесь на идее, что argv — это массив с двумя измерениями (это не так, это массив с указателями одного измерения), тогда

char* argv[] = {
"one", "two", "three", "four", 0};

будет работать (игнорируя постоянные проблемы)

0
По вопросам рекламы [email protected]