我正在读一本算法书,我发现自己被困在这一点上。我创建了一个双向链表,当我尝试打印出它的内容时,它打印出我认为的地址或其他与我想要的无关的值。这是代码:
typedef struct double_element *dElement;
struct double_element
{
int value;
dElement prev;
dElement next;
};
dElement createNewDListWithElements(int count)
{
dElement element = malloc(sizeof(dElement));
element->value = 1;
element->next = NULL;
element->prev = NULL;
dElement previous = element;
for (int i = 1; i < count; i++) {
dElement el = malloc(sizeof(dElement));
el->value = i;
el->next = NULL;
el->prev = previous;
previous->next = el;
previous = el;
}
return element;
}
void printDList(dElement node)
{
printf("printing doubly linked list:\n");
while (node) {
printf("%i\n", node->value);
node = node->next;
}
printf("end printing double linked list\n");
}
这是输出:
printing doubly linked list:
1
1070320
1070336
1070352
1070368
1070384
1070400
1070416
1070432
1070448
end printing double linked list
答案 0 :(得分:6)
您的问题是您正在尝试为struct double_element
分配空间,但您只需要足够的空间来存储struct double_element*
。
答案 1 :(得分:2)
问题是你是为指针而不是结构本身分配空间,这是指针危险typedef
的原因,如果你想保证分配是正确的,无论typedef
如何您可以在代码中执行此操作
dElement element = malloc(sizeof(*element));
将为结构分配空间,就像你调用了
一样dElement element = malloc(sizeof(struct double_element));
你可以看到typedef
是有害的,指针应该是一个明确的指针,所以编写代码的正确方法不会出现这种问题
struct double_element *element = malloc(sizeof(struct double_element));
/* ^ don't skip this no matter what */
另外,你应该清楚结构名称是什么以及如何命名你的变量,例如你可以使用 CamelCase 作为结构名称,使用带有下划线的小写作为变量,类似于此
struct DoubleElement *element = ...
它会清楚地表明DoubleElement
是结构的名称,即使你可以离开struct
而不是tyepdef
,因为这样可以使它更清晰。