Проблема с указателями C в двумерных массивах символов - PullRequest
1 голос
/ 17 августа 2011

Почему это работает:

    //split returns (char**)
    char *temp2;
    temp2=split(array[i],'=')[1];

, а это не так:

char **temps;
temps[0]=temp2; //crashes

или это:

temps[0]=split(array[i],'=')[1]; //crashes

Ответы [ 8 ]

2 голосов
/ 17 августа 2011

temps - это просто указатель на char*, но он не имеет инициализированного, разумного значения!temps[0] эквивалентно *(temps + 0), но вы не можете разыменовать значение мусора - сначала нужно сделать temps точек где-нибудь полезным, например, выделив для него память.

Если вы хотите сохранить некоторыеchar* с автоматическим хранением, а затем объявите массив указателей на символы:

char * temps[20];
temps[0] = /*... etc. ...*/
2 голосов
/ 17 августа 2011

Split возвращает указатель на указатель на символ . Итак, из split(array[i],'=')[1] возвращается указатель на символ , который вы объявили в стеке и, таким образом, зарезервировали для него место. Вот почему это работает.

Два других не работают, потому что пространство, на которое указывает, не выделено. Вы должны использовать malloc ().

0 голосов
/ 17 августа 2011

Думайте об этом так:

char *temp2 = "foo";

char **temps;

temps[0] = temp2; // won't work
temps = &temp2; // ok

temp2 указывает на строку C.Вы можете указывать временные значения по адресу temp2, (& temp2), но вы не можете разыменовать временные значения (то есть временные значения [0]), если сначала не указали на что-то допустимое.Из вашего вопроса звучит так, как будто вы хотите сначала выполнить malloc () для массива char *.

Во втором и третьем случаях вы разыменовываете temps [0], предварительно не обращаясь к какой-либо допустимой ячейке памяти.Как уже указывалось, temp указывает на место для мусора.

Ваш первый случай работает, потому что вы разыменовываете split (), поэтому он дает вам символ *.

0 голосов
/ 17 августа 2011

Потому что временные параметры не инициализированы. Это случайное значение, указывающее на случайную ячейку памяти.

0 голосов
/ 17 августа 2011
char **temps;
temps[0]=temp2; //crashes

Указатель temps не инициализирован.Разыменование это неопределенная операция.

0 голосов
/ 17 августа 2011

man malloc ()

Вы должны выделить свою память, чтобы получить место!

0 голосов
/ 17 августа 2011

char **temps никогда не выделялось ни одного пробела.Вы разыменовываете плохую память с помощью temps[0].

0 голосов
/ 17 августа 2011

Если вы просто объявляете переменную-указатель:

char **temps;

Это на самом деле не указывает куда-то.Ну, на самом деле это так, но это, вероятно, мусор (где-нибудь в памяти).Вы должны инициализировать его перед использованием.Попробуйте выделить место для этого.

...