Почему я получаю segfault при попытке доступа к членам структуры?

#c #dll #operating-system #queue #valgrind

Вопрос:

Я получаю ошибку сегментации всякий раз, когда пытаюсь распечатать значение, хранящееся в структуре. Используя Valgrind, я смог немного сузить его до одного блока кода, но я не уверен, что делаю неправильно. Я неправильно инициализирую свою структуру?

Всякий раз, когда я запускаю valgrind, он сообщает мне, что есть недопустимая запись размера 8, где я говорю newList->данные = d>.

 typedef struct List {
  struct List *np[Ends];        // next/prev neighbors
  Data data;
} *List;

typedef void *Data;

static void put(Data d) {
  List newList = malloc(sizeof(List));
  newList->data = d;
}
 

Ответ №1:

Это пример того, почему это плохая практика для typedef указателя.

Потому List что определяется как псевдоним для struct List * , sizeof(List) дает вам размер указателя, а не размер структуры. В результате вы выделяете недостаточно памяти.

Вместо этого вы хотите либо malloc(sizeof(struct List)) или (предпочтительно) malloc(sizeof *newlist)

Комментарии:

1. Да, если вы собираетесь вводить указатели, (например. чтобы избежать ****какого-то типа, совсем не плохая практика:), затем сделайте это очевидным, например, «pList» или «ListPtr».