このコードでは、なぜ私のテストで結果が常に、、、1
で2
あるの3
ですか?
#include <stdio.h>
void test() {
int a;
a++;
printf("%d",a);
}
int main(int argc, char *argv[]) {
test();
test();
test();
}
の変数は静的だと思いますtest()
ね。なぜ?
このコードでは、なぜ私のテストで結果が常に、、、1
で2
あるの3
ですか?
#include <stdio.h>
void test() {
int a;
a++;
printf("%d",a);
}
int main(int argc, char *argv[]) {
test();
test();
test();
}
の変数は静的だと思いますtest()
ね。なぜ?
変数は静的ではありません。初期化されていない変数にアクセスしています。動作は未定義です。
他の答えが言ったように、あなたの変数は初期化されていません。おそらくコンパイラがスタックをゼロでクリーンアップするコードをコンパイルしたprolog(prologue)
ために、1、2、および3が出力されます。
Cのローカル変数は、実際にはスタック上のオフセットを指しておりstack frame
、呼び出しが返された後に復元されます。
私はグーグルでこれについて語ったアーティカルをランダムに選択しました。[関数呼び出しはどのように機能しますか?]。
これは、その[アセンブリプログラミングアセンブリ関数スタックフレームの説明]についてのビデオトークです(ここでも、ランダムに選択されています)。
また、ウィキペディアでは[コールスタック]についても説明しています。
初期化されていない値で作業しているため...(この場合はランダムな動作)。
変数を初期化します(例を0に):
#include <stdio.h>
void test(){
int a=0;
a++;
printf("%d",a);
}
int main(int argc, char *argv[]) {
test();
test();
test();
}
いいえ、変数はまったく静的ではありません!
https://stackoverflow.com/a/1597426/1758762
静的変数(ファイルスコープと関数static)はゼロに初期化されます:
int x; // zero
int y = 0; // also zero
void foo() {
static int x; // also zero
}
非静的変数(ローカル変数)は不確定です。値を割り当てる前にそれらを読み取ると、未定義の動作が発生します。
void foo() {
int x;
printf("%d", x); // the compiler is free to crash here
}
印刷しようとしている変数は静的ではなく、初期化されていないため、ガベージ値を取得しています。これはランダムに見えます。このプログラムを別のマシンで実行すると、出力が異なります。ゴミの価値が違う
それを回避するには、変数を何らかの値で初期化する必要があります