main
プログラムの最初の実行中に、プロセス メモリのスタック セグメントに関数のアクティベーション レコードが作成されます。そのmain
アクティベーション レコードでは、その function( ) のローカル変数にメモリを割り当てmain
、内部目的のためにさらにメモリを割り当てます。プログラムにはローカル変数がないため、アクティベーション レコードmain
内のローカル変数にメモリを割り当てません。main
次に、 function を呼び出すためのステートメントの実行中test
に、呼び出し元の function( ) のアクティベーション レコードをもう 1 つ作成し、ローカル変数にバイトをtest
割り当てます。20
word
コントロールが関数test
を終了すると、その関数用に作成されたアクティベーション レコードがそのスタックからポップされます。printf
次に、呼び出された関数の残りのステートメント () を実行し続けますmain
。ここで printf は、test
すでにスタックからポップされている関数のローカル変数の文字を出力しようとしています。したがって、この動作は未定義です。適切な文字列が出力される場合もあれば、不要な文字列が出力される場合もあります。
したがって、この状況では、動的メモリのみが明らかになります。動的メモリの助けを借りて、変数の有効期間 (またはスコープ) を制御できます。したがって、以下のように動的メモリを使用します。
char *word = NULL:
word = (char *) malloc(sizeof(char) * 20);
注 : malloc の戻り値の NULL チェックに注意しprintf
、main 関数の後で割り当てられたメモリを解放することを忘れないでください。