переназначение указателя приводит к ошибке сегментации

#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 указывает на неизвестный адрес, доступ к нему приведет к ошибке сегментации.