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

C 未初始化的变量是否占用内存?,c,C,在这个简短的例子中,我昨天考试的一个问题: int main() { short a; } “a”是否占用任何内存空间?当我提出: printf("%u %d\n",a, sizeof(a)); 我打印了一个“0 2”,所以我认为“0”表示内存尚未初始化,但我的老师说是的,它已经占用了2个字节 谢谢, 丹尼 初始化变量是否占用内存 对。我猜你是想在那里使用未初始化的。答案仍然是肯定的 当您使用未初始化变量的值时,如在printf调用中,程序会受到未定义行为的影响 但是,sizeofa

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

int main() {
    short a;
}
“a”是否占用任何内存空间?当我提出:

printf("%u %d\n",a, sizeof(a));
我打印了一个“0 2”,所以我认为“0”表示内存尚未初始化,但我的老师说是的,它已经占用了2个字节

谢谢, 丹尼

初始化变量是否占用内存

对。我猜你是想在那里使用未初始化的。答案仍然是肯定的

当您使用未初始化变量的值时,如在printf调用中,程序会受到未定义行为的影响

但是,sizeofa是在编译时计算的。它不取决于变量是否初始化

初始化变量是否占用内存

对。我猜你是想在那里使用未初始化的。答案仍然是肯定的

当您使用未初始化变量的值时,如在printf调用中,程序会受到未定义行为的影响


但是,sizeofa是在编译时计算的。它不取决于变量是否初始化。

正确答案是“可能”。编译器必须给你一种错觉,它确实占用了内存,在大多数实际情况下,它会占用内存


然而,编译器可以自由地做它想做的事情,只要它保持这种错觉。在没有printf的示例中,永远不会使用变量a。编译器可以自由地对其进行优化,因此它可能不会使用任何内存。事实上,当您启用优化标志(如gcc的-O3)时,经常会发生这种情况。

正确答案是“可能”。编译器必须给你一种错觉,它确实占用了内存,在大多数实际情况下,它会占用内存


然而,编译器可以自由地做它想做的事情,只要它保持这种错觉。在没有printf的示例中,永远不会使用变量a。编译器可以自由地对其进行优化,因此它可能不会使用任何内存。实际上,当您启用优化标志(例如gcc的-O3)时,经常会发生这种情况。

当您声明短a;,编译器为a分配内存,该内存包含一些不确定的值。在本例中,它可能是0,这就是您得到的结果,但程序的行为未定义,无法说明任何内容。

当您声明短a;,编译器为a分配内存,该内存包含一些不确定的值。在这种情况下,它可能是0,这就是您得到的结果,但是程序的行为是未定义的,不能说什么。

是的。声明的变量占用空间。sizeof运算符返回短数据类型的大小


此外,如果您没有使用after声明(例如,您没有初始化它或在代码中的任何其他地方使用它),编译器可能会对其进行优化。

是。声明的变量占用空间。sizeof运算符返回短数据类型的大小


此外,如果您没有使用after声明(例如,您没有初始化它或在代码中的任何其他地方使用它),编译器可能会对其进行优化。

这取决于许多因素

首先,优化器可能会也可能不会完全删除该变量。虽然在您的代码中并不是这样,但是如果您真的在printf调用中使用它,也就是UB,正如其他人所注意到的

接下来,你说的占用内存是什么意思?在这里,编译器很可能会使用一段堆栈内存,这段内存无论如何都应该保留给前面的进程。若它不在main中,那个么在函数返回时那个内存就会被释放。所以这不是一种实际的浪费

我认为“0”表示内存尚未初始化


没有。当一个人说初始化时,他的意思是初始化到某个已知值。另一方面,未初始化并不意味着非零,而是一些垃圾/我不知道/我不在乎等等。

这取决于许多因素

首先,优化器可能会也可能不会完全删除该变量。虽然在您的代码中并不是这样,但是如果您真的在printf调用中使用它,也就是UB,正如其他人所注意到的

接下来,你说的占用内存是什么意思?在这里,编译器很可能会使用一段堆栈内存,这段内存无论如何都应该保留给前面的进程。若它不在main中,那个么在函数返回时那个内存就会被释放。所以这不是一种实际的浪费

我认为“0”表示内存尚未初始化


没有。当一个人说初始化时,他的意思是初始化到某个已知值。另一方面,未初始化并不意味着非零,而是一些垃圾/我不知道/我不在乎等等。

在没有任何printf的函数中,变量被优化掉,因为它未使用。对于printf,您调用未定义的行为,因为您引用了一个未初始化的变量print-该值当然不能保证为0。您的问题包含一个未初始化的变量
变量不是初始化的变量,如标题所示。实际上,对其值的任何访问都会产生未定义的行为。请注意,打印sizeofa的正确格式为%zu-z表示sizeof结果的类型。在不带任何printf的函数中,由于未使用该变量,因此对其进行了优化。使用printf时,您调用未定义的行为,因为您引用了未初始化的变量print-该值当然不能保证为0。您的问题包含未初始化的变量,而不是像标题所示的初始化变量,对其值的任何访问都会产生未定义的行为。请注意,打印sizeofa的正确格式为%zu-z表示size_t,这是sizeof结果的类型。请注意,即使已初始化,如果未使用该值,变量及其初始化也可能会在代码之外进行优化。请注意,即使已初始化,如果该值未使用,则可以在代码外优化变量及其初始化。