在c中,代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int item;
struct node* next;
}Node;
Node * newNode(int i)
{
Node *x=malloc(sizeof(Node));
x->item=i;x->next=NULL;
return x;
}
int main()
{
int a=2;
Node *p=newNode(a);
printf("%d\n",p->item);
return 0;
}
函数newNode(int)结束后,指针x被释放,然后指针p得到一个垃圾地址。但结果是2.请解释这个过程。谢谢。
答案 0 :(得分:1)
函数newNode()
指针x
未释放后,因为你从未使用free(x)
,因此指针仍然有效!
return x;
此处x的值是Node
结构所在的内存位置的地址。
Node *p=newNode(a);
这里类型指针的变量p(意思是,它的值是一个地址)将等于newNode()
返回的值,所以它将指向同一个项目x
指向newNode()
函数内部。
答案 1 :(得分:1)
如果我理解你的问题,你认为因为x被释放(通过退出函数),p应该是垃圾。这是不正确的。首先,x指向的地址放在返回堆栈上。然后x被释放,因为你离开了函数,x现在已经超出了范围。返回逻辑将返回堆栈中的值放入p。 malloc获取的地址未被释放,并由p。
指向在明确告知之前,C不会释放内存。即使它在所有引用消失时自动释放内存,仍然会通过返回p。
保留引用考虑一个简单的算术运算
int func(a, b)
{
int c = a+b;
return(c);
}
int d = 0;
d = func(1, 2);
printf('%d\n', d);
即使c变成垃圾,输出也是3,因为值已经过了。类似地,地址被传递并且该内存位置的内容仍然有效,因为您没有在分配的内存区域上调用free()。
答案 2 :(得分:0)
您的条件是。在数据类型中构建有效..但对于malloc,我们使用free来释放内存。因此,即使在调用函数之后,值仍然存在,并且该值存在于主程序中,因为它使用地址而不是值。