Ошибка сегментации при доступе к структуре - PullRequest
0 голосов
/ 08 октября 2019

Я получаю ошибку сегментации (сброшенные ядра) в результате этого кода:

char **getPipedCmds(Pgm *p){

  if (p == NULL) {
  } else {
    char **pipedP = p->next->pgmlist; // I'm the line where the seg fault occurs.
    return pipedP;
  }
}

А вот определения структуры, вероятно, очень полезные здесь ...

typedef struct c {
  char **pgmlist;
  struct c *next;
} Pgm;

typedef struct node { 
  Pgm  *pgm;
  ...
} Command;

Итак, есть ли способ получить нужные мне данные из p->next->pgmlist без ошибки сегмента?

1 Ответ

3 голосов
/ 08 октября 2019

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

Насколько я вижу, вы не проверяете, существует ли p->next или нет, прежде чем получить к нему доступ. Если это NULL, это будет неопределенное поведение, и вы получите ошибку сегментации. Если это случайное значение, вы должны соответствующим образом инициализировать свою структуру при выделении памяти, в этом случае next в NULL.

Добавив эти несколько строк, вы должны быть в безопасности.

if (p != NULL) {

    if (p->next != NULL) {
        char **pipedP = p->next->pgmlist; // I'm the line where the seg fault occurs.
        return pipedP;
    }

}

Несколько советов,

  1. Когда вы выделяете память для структуры, установите для нее значение 0 (т. Е. memset(mem, 0, sizeof mem))
  2. При обращении к указателю всегда проверяйте, имеет ли он значение NULL илинет, в противном случае вы бы сгенерировали ошибку сегментации, как здесь
  3. Когда ваша программа была убита, вы можете отследить, почему ваша система ее убила, с помощью coredumpctl gdb (она примет последний дамп, сгенерированный на вашем компьютере, иположи его на gdb для отладки)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...