質問

Cプログラムが起動し、変数がメモリの場所に割り当てられたとき、C標準はその値が初期化されているかどうかを示しますか?

// global variables
int a;
int b = 0;
static int c;

上記のコードでは、「b」は0に初期化されます。「a」の初期値は何ですか? 'c'はこのモジュールに対して静的であるため、違いますか?

役に立ちましたか?

解決

global 変数に特に言及しているため、グローバル変数の場合、 static として宣言されているかどうかにかかわらず、0に初期化されます。

一方、

ローカル変数は未定義になります( static と宣言されている場合を除き、その場合も変数は0に初期化されます) -タイラー・マクヘンリーに感謝します)。つまり、特定のものを含むものに依存することはできません-その場所のメモリに既にランダムなゴミが含まれているだけで、実行ごとに異なる可能性があります。

他のヒント

  

編集: 以下はローカル変数にのみ適用され、グローバル変数には適用されません。

変数の初期値は未定義です。一部の言語では、メモリ内の変数の場所は宣言時にゼロになりますが、C(およびC ++)でも、初期化されていない変数には、その場所に存在するガベージが含まれます。

だから、それを考える最良の方法は、初期化されていない変数にゴミが含まれ、動作が未定義になる可能性が高いことです。

a はゼロであり、 c もグローバルであり、明示的に初期化されていない場合。これは、ローカルの静的変数にも当てはまります。

ローカルの非静的変数のみが初期化されません。また、mallocで割り当てられたメモリは初期化されません。

こちら さまざまなオブジェクトのCでの初期化と割り当てのルール。

今朝、あまりにもゆっくりと入力しています。私が答えていたときに3人がすぐに現れたので、私の投稿のほとんどを削除しました。私が見つけたリンクは明快で簡潔だったので、とにかくそれを投稿しています。 基本的な問題の議論。

簡単なテストでは、aとcが0であることが示されています。

int a;
static int c;
int main() {
    printf("%d %d\n", a, c);
    return 0;
}

a(およびc)の場所はコンパイル時に決定されます。つまり、それらはスタックにも、mallocによって返されるメモリ間隔にも置かれません。 C標準では、すべての場合に0に初期化されると書かれていると思います。

c については99.9%、 a については98%自信があります。グローバル変数のコンテキストでのキーワード static は、実際には(たとえば)C ++およびJavaの private と類似しています。それは、保存場所ではなく、可視性に関するものです。

初期化されていない変数についてAndrew Hareが言ったことは、スタックまたはmallocされたメモリに保存されたデータに当てはまります。静的に保存された変数ではそうではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top