未初始化的变量是否会占用内存?

时间:2016-03-25 05:34:47

标签: c

在这个简短的例子中,我昨天的考试中提出了一个问题:

int main() {
    short a;
}

' a'占用任何内存空间?我做的时候:

printf("%u %d\n",a, sizeof(a));

我打印了一张' 0 2'所以我认为' 0' 0意味着没有记忆尚未初始化,但我的老师说是的,它已占用2个字节。

谢谢, 达尼。

5 个答案:

答案 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” - 例如,您没有初始化它或在代码中的任何其他位置使用它 - 编译器可能有机会对其进行优化。