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