#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».