2014-03-07 97 views
0

在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得到垃圾address.But結果爲2。請解釋這個過程。謝謝。

+0

爲什麼不呢?返回的東西總是一個副本(即使它是一個C++引用,它本質上是一個指針的副本) –

回答

1

後功能newNode()指針x沒有發佈,因爲你從來沒有使用過free(x),因此指針仍然有效!

return x; 

x的這裏的值是其中Node結構存在的存儲器位置的地址。

Node *p=newNode(a); 

這裏類型的變量p 指針(意思是,它的值是一個地址)將等於由newNode()返回的值,所以它會被指向相同的物品,其x指着內部newNode()函數。

0

您的條件is.valid爲構建數據類型..但malloc我們使用釋放釋放內存。所以即使在函數調用結束之後該值仍然存在,並且該值存在於主程序中,因爲它使用地址而不是值。

1

如果我理解你的問題,你認爲,因爲x被釋放(通過退出函數),p應該是垃圾。這是不正確的。首先由x指向的地址放在返回堆棧上。然後釋放x,因爲你已經離開函數,x現在超出了範圍。返回邏輯將來自返回堆棧的值放入p中。 malloc獲得的地址沒有被釋放,並且被p指向。

直到明確告知C不會釋放內存。即使它在所有引用消失時自動釋放內存,引用仍然通過返回到p而保留。

考慮一個簡單的算術opertion

int func(a, b) 
    { 
    int c = a+b; 
    return(c); 
    } 

int d = 0; 
d = func(1, 2); 
printf('%d\n', d); 

輸出是3既是C成了垃圾,因爲值穿過。同樣,地址已經通過,並且該內存位置的內容仍然有效,因爲您沒有在分配的內存區域上調用free()。

相關問題