2011-06-21 8 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です。

myfunc2myfuncが返された後で何らかの形でこのポインタを使用しようとすると、スタックが既に復元されているためにポインタが指し示すような予期しないことが起こります。

関連する問題