在这个简短的例子中,我昨天的考试中提出了一个问题:
int main() {
short a;
}
' a'占用任何内存空间?我做的时候:
printf("%u %d\n",a, sizeof(a));
我打印了一张' 0 2'所以我认为' 0' 0意味着没有记忆尚未初始化,但我的老师说是的,它已占用2个字节。
谢谢, 达尼。
答案 0 :(得分:3)
正确答案是“可能”。编译器必须给你一种它占据内存的错觉,在大多数实际情况下它会。
但是,编译器可以自由地执行它想要的操作,只要它保持这种错觉。在没有printf
的示例中,永远不会使用变量a
。编译器可以自由地优化它,因此它可能不会使用任何内存。实际上,当您启用优化标记时经常会发生这种情况,例如-O3
的{{1}}。
答案 1 :(得分:2)
初始化变量是否占用内存?
是。我猜你打算在那里使用 uninitialized 。答案仍然是肯定的。
当你使用未初始化变量的值时,就像调用printf
一样,程序会受到未定义的行为的影响。
但是,sizeof(a)
是在编译时计算的。它不取决于变量是否已初始化。
答案 2 :(得分:1)
当您声明 server {
server_name abc.mydomain.com;
location /{ proxy_pass http://localhost:7000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade;
}
}
时,编译器为short a;
分配内存,并且此内存包含一些不确定的值。在这种情况下,它可能是a
,这就是你得到的,但程序的行为是未定义的,没有什么可以说的。
答案 3 :(得分:1)
这取决于很多因素。
首先,优化器可能(或可能不)完全删除该变量。虽然你的代码中的情况并非如此,但如果你真的在printf
电话中使用它(就像其他人注意到的那样是UB)。
接下来,你是什么意思"占据记忆"?这里的编译器很可能会使用一块堆栈内存,无论如何都应该为之前的进程保留。如果它不在main()
内,那么在函数返回时该内存将被释放。所以它不是真正的"实用的"浪费。
我认为' 0' 0意味着没有记忆尚未初始化
不。当一个人说"初始化"时,他的意思是"初始化为某个已知值"。另一方面,"未初始化"并不意味着"非零"而是"一些垃圾" /"我不知道" /"我不在乎"等
答案 4 :(得分:0)
是。声明的变量占用空间。 sizeof
运算符返回短数据类型的大小。
此外,如果您在声明后没有使用“a
” - 例如,您没有初始化它或在代码中的任何其他位置使用它 - 编译器可能有机会对其进行优化。