2011-06-21 31 views
4

考慮下面的代碼: -返回不是動態分配的本地結構變量?

struct mystruct { 
    int data; 
    struct mystruct *next; 
}; 

void myfunc() 
{ 

struct mystruct s1; 
s1.data= 0; 
s1.next = NULL; 
myfunc2(&s1); 
.. 
.. 
} 

是安全的這一局部結構的地址傳遞給其他的功能。 這個局部結構是否可以在函數外部使用,還是已經被釋放了?

回答

6

將局部變量的地址傳遞給另一個函數是安全的。變量的生存時間延伸到聲明它的塊(函數或複合語句)的末尾。

返回一個局部變量的地址或保存一個指向它的指針並在聲明函數返回後使用它是不安全的。

1

你的措辭在這個問題上很尷尬。

您可以通過地址將它傳遞給其他函數。它仍然在有效範圍內。

但是你不能在你聲明它的函數之外通過地址(你沒有在這裏做)返回它。

1

它將在myfunc2可用,但只有myfunc還沒有返回。

如果myfunc2以某種方式記住了這個指針,並在myfunc返回後嘗試使用它,由於堆棧已經被恢復並且指針指向了任何垃圾,指示器將發生不可預知的事情。