#c #pointers #double-pointer
#c #указатели #двойной указатель
Вопрос:
У меня возникла проблема с пониманием того, почему я не могу выполнить переназначение для lastPrefix, в указанной строке это приводит к ошибке сегмента. Кажется, мне не хватает чего-то фундаментального.
char * somefunc(char ** strs, int numStrings)
{
char * lastPrefix;
printf("%dn", *(strs[0] 0));
printf("%dn", *(strs[1] 0));
printf("%dn", *(strs[2] 0));
printf("%dn", *(strs[0] 1));
printf("%dn", *(strs[1] 1));
printf("%dn", *(strs[2] 1));
printf("%dn", *(strs[0] 2));
printf("%dn", *(strs[1] 2));
printf("%dn", *(strs[2] 2));
printf("%dn", *(strs[0] 0));
printf("%dn", *(strs[1] 0));
printf("%dn", *(strs[2] 0)); // ALL IS WELL
*lastPrefix = *(strs[1] 0);
*lastPrefix = *(strs[2] 0);
*lastPrefix = *(strs[0] 1); // WILL SEGMENT FAULT HERE
*lastPrefix = *(strs[1] 1);
*lastPrefix = *(strs[2] 1);
}
int main()
{
char * strs[] = {
"flower", "flow", "flight"
};
char * res = somefunc(strs, SIZEOF(strs));
}
Могу ли я также попросить хорошую ссылку для указателей C?
Комментарии:
1.
*lastPrefix = *(strs[1] 0);
вы разыменовываетеlastPrefix
, что не указывает на действительную память.
Ответ №1:
Когда вы создаете любую переменную, будь то указатель или данные, начальным значением переменной будет некоторый мусор или 0. В вашем случае,
char *lastPrefix;
Это такая переменная, которая содержит некоторое мусорное значение. Вы должны присвоить ему допустимое значение, используя malloc()
или что-то в этом роде. Или же, когда вы отменяете ссылку на него ( *
) , он может указывать на какую-то недоступную или даже несуществующую ячейку памяти. Возможно, это указывает на середину вашего кода. Возможно, это указывает на NULL . Подобные воспоминания недоступны в пользовательском пространстве. Итак, Windows (или linux) убивает вашу программу.
Что вы хотите сделать:
char *lastPrefix;
lastPrefix=malloc(101); //holds strings upto 100 characters
Значение malloc()
будет выделено в вашу переменную из кучи, и программа должна работать нормально.
Просто не забудьте освободить память в конце: free(lastPrefix);
Ответ №2:
int *ptr; // pointer variable declaration */
int kk; // actual variable declaration */
*a = 11; // `a` pointing to unknown memory address and accessing this will give segmentation fault/
a = amp;kk; *a = 11 // This is valid. store address of `kk` in pointer variable */
Аналогично, в вашем коде lastPrefix
указывает на неизвестный адрес, доступ к нему приведет к ошибке сегментации.