[英]Why an uninitialized variable in C still produces output
我試圖弄清楚為什么即使本地變量i在這個C程序中從未初始化,很多系統都會打印出0 1 2 3 4 5 6 7 8 9
有人可以解釋為什么會這樣嗎? 任何幫助表示贊賞!
void foo() {
int i;
printf("%d ", i++);
}
int main() {
int j;
for (j = 1; j <= 10; j++) foo();
}
行為未定義。 統計數據無關緊要。 這可能是因為堆棧的布局和初始化,但也可能是出於任何其他原因。
例如,假設:
i
在堆棧上分配,而不是寄存器。 在這種情況下, i
將每次引用堆棧上的相同位置,將從0開始,並且堆棧上的相同位置每次都會遞增1。
變量i
在堆棧上創建,您沒有初始化它。 所以它包含一些你無法預測的垃圾值。 幸運的是,在您的情況下,垃圾值最初為0。 如果在另一個系統上運行,您將獲得一組不同的值。 這個行為肯定是未定義的。
因為除了在for循環中調用該函數之外沒有做任何事情,幸運的是,該變量i
每次都被銷毀並重新分配相同的內存空間。 因此它也在迭代中保留其價值。
在我的系統上,它給出了這些值。
2009288233
2009288234
2009288235
2009288236
2009288237
2009288238
2009288239
2009288240
2009288241
2009288242
這可能是因為函數中的局部變量被重復分配並從同一個內存塊中釋放出來。 這就是輸出重復遞增的原因。
初始值為零是運氣。 它可能是任何其他垃圾價值。
行為未定義,不適用於其他系統。
由於這是一個簡單的程序,你很幸運,我使用相同的內存位置。 由於未初始化,因此將獲取之前的值。
然而,這是未定義的。 應該用警告編譯它來挑選這個bug。
正如其他人所說,它是未定義的行為,因此沒有可靠的答案。
也就是說,你可能會認為你得到的最常見的值是0到9.這可能是因為操作系統在程序收到之前將堆棧占用的內存歸零。 foo()
表示已經進行的最深的調用,因此它使用的是操作系統將其歸零后未觸及的內存,因此在第一次調用時,它很可能仍然包含零。
在每次后續調用中,它可能占據堆棧上的相同位置,因此在每次后續調用開始時,它可能以它在上一次調用結束時的值開始。
正弦它是未定義的行為,根本沒有保證,但是,它可能至少有可能不是。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.