我很難理解這兩個源代碼的打印值。簡單的C代碼片段
#include<stdio.h>
void a(void){
int a;
a++;
printf("%d\n",a);
}
int main(void){
a();
a();
a();
return 0;
}
爲什麼這個代碼打印出 「1 2 3」,而第二個:
#include<stdio.h>
void a(void){
int a;
a++;
printf("%d\n",a);
}
int main(void){
int b;
printf("%d\n",b);
a();
a();
a();
return 0;
}
打印出:「0,垃圾值,相同的垃圾值1,相同垃圾值+ 2「。
不應該爲主函數(或任何其他函數)中的任何未初始化的對象分配一個隨機(垃圾)值?
更新:我覺得解釋「變量是未初始化的,所以他們可以有其他程序的任何剩餘值 - > UB」是不夠的。我可以複製粘貼相同的源代碼100次,仍然可以得到0的打印值。我正在使用gcc 4.4.3。
不定值。無論堆棧是什麼,你都會得到。在第二種情況下,由於通過在'main'中添加局部變量來更改堆棧,所以它不同。在第一種情況下,在'a'的地址處堆棧中的值是'0'。 '0'可以是隨機的'0'。 – lurker
在第一種情況下,可能是因爲編譯器決定在'0'處「初始化」a的值,所以你會得到一組合理的值。這種行爲將是編譯器特定的。請將您使用的編譯器添加到您的問題中。 – abiessu
@abiessu;那不是那個UB嗎? – haccks