質問
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されたメモリに保存されたデータに当てはまります。静的に保存された変数ではそうではありません。