为什么局部变量可以是函数的返回值?

时间:2014-03-07 01:50:56

标签: c linked-list local-variables

在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.请解释这个过程。谢谢。

3 个答案:

答案 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来释放内存。因此,即使在调用函数之后,值仍然存在,并且该值存在于主程序中,因为它使用地址而不是值。