書式#include <stdio.hに> する#include <stdlib.h>に含ま する#include < 文字列の.h> の#pragma警告(無効:4996) / * メモリIVの コード市外局番:オペレーティングシステムの管理-内部ROM グローバル領域グローバル:静的変数、グローバル変数とリテラル-内蔵ROM 、スタック領域のスタック:ローカル変数-空間的な流通システム、自動回復 ヒープヒープ:maoolc、無料、削除-プログラマの手動解除 プログラムフロー命令: 1.オペレーティング・システムメモリにコードハード物理的負荷 オペレーティングシステムコード2は、4つのゾーンに分割されているC * / CHAR * get_str1(){ チャー *のA = 「ABCE 」 ; // 「ABCE」リテラル定常領域、スタック領域 のprintf("get_str1は:A =%Pは、&A =%P \ N- "A、およびAは); 返す; } CHAR * get_str2(){ CHAR * B = " ABCEを" ; // " ABCE「リテラル領域、Bスタック領域 printf(" get_str2:B =%P、およびB =%Pが\のN- "、B&B); 戻りB; } int型メイン(ボイド){ CHAR * P = NULL; // Pスタック領域 チャー * Q = NULL ; // Pスタック領域 P = get_str1(); // この関数アクション:リターンアドレスにP点get_str1 Q =get_str2(); のprintf(" P = P%、%P = S \ N- "、P、P); // 両方の点同じアドレスには、リテラルの定常領域と同じである のprintf(" Q =%P、Q %S = \ N- "Q、Q); のprintf(" \ N- " ); システム(" PAUSE " ); 戻り0 ; }
メモリ分析
[注:先生から自分の理解を説明するために、間違った場所が見て私を修正]
[注:このプログラムはvs2013バージョンを使用して検証されます]
プレリュード1:場所コード市外局番
2プレリュード:グローバル変数を見つける、同じグローバル変数のグローバル領域は一度だけ配置され、変数のアドレスを記録しています。
グローバル領域に格納されたリテラルとしてABCEと、アドレスは:003A5858、
プログラムの実行1:スタック領域p、qは2つのポインタ変数を作成します。
2プログラムが実行される:スタック領域にget_str1する()スペースを割り当てます
実行プログラム3:get_str1()空間領域内のスタックポインタ変数を作成し、変数の値が格納する003A5858
4プログラムの実行:印刷(アドレスへのポインタ変数ポイント変数のグローバルアドレス)と 、ポインタ変数がアドレス自体0021F7F8あります
プログラムの実行5:get_str1()は、Pに送信戻り値を終了し、スタック(この時点では、pの値となる空間回復さ003A5858を)
プログラムの実行6:とget_str2()get_str1()と同じステップアウトが繰り返されることはありません。
...
プログラムの実行7:アドレスポインタ変数とポインタ変数のポイントで内容を印刷します