【发布时间】:2014-06-21 11:11:42
【问题描述】:
假设我有以下代码:
typedef struct _SingleList {
struct _SingleList *link;
int data;
} SingleList;
SingleList *prepend(SingleList *list, int data) {
SingleList a;
SingleList *newNode = &a; // Note, here I assign memory using structure not malloc.
newNode->data = data;
newNode->link = list;
return newNode;
}
正如您在上面的 prepend 函数中看到的那样,我使用 a 地址而不是 malloc 分配内存,当我调用 prepend 函数时,它工作得很好。这是一个示例:
int main(void) {
SingleList *list = NULL;
list = prepend(list, 10);
printf("%d", list->data);
list = prepend(list, 20);
printf("\n%d", list->link->data);
list = prepend(list, 30);
printf("\n%d", list->link->link->data);
}
那么,它是如何工作的,如果它也适用于其他人,那么为什么我们使用malloc() 来表示链表而不是简单地分配结构。
【问题讨论】:
-
您只是觉得这行得通,但事实并非如此。调用更多函数来丢弃堆栈,打印所有值,然后看着它倒下并死掉。
-
@pmr,你是对的。我又叫了几次。实际上,我在第三次拨打
prepend后拨打了printf("%d", list->data)。它打印 30,而不是 10。 -
我想知道你是如何编译、调试或发布的?通过优化,它可能会更快失败。 @pmr 我认为您在解释和描述 UB =) 方面树立了新的品质。
-
作为一般规则,您不能使用测试来确定 C 语言中的工作方式:如果它不起作用,则说明您做错了。如果它似乎有效,那么您很可能仍然做错了。
标签: c struct linked-list