假设我有以下代码:
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()
用于链表而不是简单地分配结构。
答案 0 :(得分:3)
在函数prepend
中,返回值newNode
是指向局部变量a
的指针。当函数结束时,它将访问它的未定义行为。只需发生就可以通过这个简单的代码在您的机器中工作,您无法依赖它。
答案 1 :(得分:2)
它不起作用。如果它显示正确的值,则它是纯粹的巧合,并且内存不会被其他人或其他人覆盖。当prepend()
函数退出时,将释放为a
结构分配的内存。该结构的内存仅在本地环境中可用。