[英]Why is uninitialized variable not printing garbage value?
#include <stdio.h>
void foo(void)
{
int c;
printf("%d\n", c);
}
void bar(void)
{
int b = 50;
}
int main(void)
{
bar();
foo();
}
輸出:50有人可以解釋為什么foo()
為什么輸出50而不是一些垃圾值?
我的GCC編譯器生成了以下警告。
In function ‘bar’:
source_file.c:9:9: warning: unused variable ‘b’ [-Wunused-variable]
int b = 50;
^
source_file.c: In function ‘foo’:
source_file.c:5:5: warning: ‘c’ is used uninitialized in this function [-Wuninitialized]
printf("%d\n", c);
這是打印垃圾值。 如果在C中使用未初始化的變量,則會調用未定義的行為。
C11 6.3.2.1(p2):
[...]如果左值指定了可以使用寄存器存儲類聲明的自動存儲持續時間的對象(從未獲取其地址),並且該對象未初始化(未使用初始化器聲明並且對其沒有賦值,已在使用之前執行),則行為未定義。
發生這種情況是因為您沒有初始化c
變量。
如果嘗試運行此命令:
#include <stdio.h>
void foo(void)
{
int c;
printf("%p\n", &c);
printf("%d\n", c);
}
void bar(void)
{
int b = 50;
printf("%p\n", &b);
}
int main(void)
{
bar();
foo();
}
您會看到變量的地址是相同的。 這就是為什么在打印c
時顯示50。
變量c
使用與b
相同的地址的原因是因為不需要保留b
的值,因為b
永遠不會在foo()
訪問,所以如果程序在內存中分配了另一個位置,那將是浪費的。 這就是變量c
與b
具有相同地址的原因。 您看到50(打印c
)的原因是,您從未覆蓋該地址中的值。
希望這是有道理的。
您所擁有的是未定義的行為。 該行為可能包括打印外觀正確的值。 如果您想知道為什么在這種情況下得到50,請生成一個裝配清單。
使用不同的選項進行編譯或使用不同的編譯器,您可能會得到不同的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.