Ошибка сегментации с указателем на указатель в C / Linux - PullRequest
3 голосов
/ 26 апреля 2009

В следующем коде я получаю ошибку сегментации:

Set *getpar() {...}

char function(...) 
{
   Set **S;
   *S = getpar(); /* Segmentation Fault */
   ...
}

Но странная вещь состоит в том, что с небольшими изменениями нет ошибки сегментации:

Set *getpar() {...}
...
char function(...) 
{
   Set *S;       // One less '*'
   S = getpar(); // One less '*'
   ...
}

Как я знаю, если есть 'Set **S', тогда *S является указателем на объект Set, поэтому, если второй код работает нормально, почему первый не должен? *S первого кода эквивалентен S второго кода, я не прав? Как я могу решить проблему?

Ответы [ 2 ]

9 голосов
/ 26 апреля 2009

Set ** S не инициируется, но вы разыменовываете S в следующем выражении:

* S = что угодно

Если вам не очень-очень не повезло и S не указывает на область памяти, к которой вы можете получить доступ, вы пытаетесь разыменовать недопустимый указатель.

Сначала вам нужно выделить указатель:

Set **S;
S = (S**)calloc(sizeof(S*),1);
*S = getpar();

Или, альтернативно (и, я думаю, предпочтительнее):

Set *S;
Set **T = &S;

S = getpar();

/* whatever else */
0 голосов
/ 26 апреля 2009

** S не инициализируется. Он указывает на ничто (мусор), а затем вы отменяете ссылку в следующем утверждении.

...