1. ホーム
  2. c

[解決済み] C言語で変数はメモリのどこに格納されていますか?

2022-04-13 17:18:23

質問

メモリがデータ、ヒープ、スタック、コードの4つのセグメントに分けられるとして、グローバル変数、静的変数、定数データ型、ローカル変数(関数内で定義、宣言)、変数(メイン関数内)、ポインタ、動的割り当て領域(malloc、callocを使用)は、メモリのどこに格納されるか。

以下のように割り振られると思います。

  • グローバル変数 -------> データ
  • 静的変数 -------> データ
  • 定数データ型 -----> コード
  • ローカル変数(関数内で宣言・定義) --------> スタック
  • メイン関数で宣言・定義された変数 -----> ヒープ
  • ポインタ(例. char *arr , int *arr ) -------> ヒープ
  • 動的に確保された空間(mallocとcallocを使用) --------> スタック

これらの変数は、あくまでもC言語から見た場合の話です。

C言語初心者なので間違っていたらご指摘ください。

どのように解決するのですか?

この中のいくつかは正解でしたが、問題を書いた人は少なくとも1つの問題であなたをだましたのです。

  • グローバル変数 -------> データ (正解)
  • 静的変数 -------> データ (正解)
  • 定数データ型 -----> コードおよび/またはデータ。定数そのものがデータセグメントに格納され、それへの参照がコードに埋め込まれるような状況では、文字列リテラルを考慮してください。
  • ローカル変数(関数内で宣言・定義) --------> スタック(正)。
  • で宣言され、定義された変数。 main 関数 -----> <ストライク ヒープ スタックも(先生はだまそうとしたんだ)。
  • ポインター(例. char *arr , int *arr ) -------> <ストライク ヒープ データまたはスタック、コンテキストによって異なります。C言語では、グローバルまたは static この場合、ポインタそのものがデータセグメントに入ってしまいます。
  • 動的に割り当てられた領域 malloc , calloc , realloc ) --------> <ストライク スタック ヒープ

なお、quot;stack"は正式にはquot;automatic storage class"といいます。