在这段代码中哪些可变部分存储到堆栈中?

我有以下代码,我真的不明白test_function中的哪些变量部分存储在堆栈段中?

在书中它说“这些变量的内存在堆栈段中”,所以我认为它是变量实际初始化为一个值的时候。 对?

void test_function(int a, int b, int c, int d) { int flag; //is it this char buffer[10];// and this //or flag = 31337; //this and buffer[0] = 'A'; //this. Or all of it? } int main() { test_function(1, 2, 3, 4); } 

flagbuffera,b,c,d将在堆栈上(编译器可能只是删除所有代码并将其称为死代码,因为它未被使用)。

各种C标准并不是指堆栈,它所讨论的是存储持续时间有三种(静态,自动和分配)。 在这种情况下, flagbuffer具有自动存储持续时间。 在最常见的系统上,具有自动存储持续时间的对象将在堆栈​​上分配,但您不能普遍认为。

当您进入范围时自动对象的生命周期开始,并且在您离开范围时结束,在这种情况下,您的范围将是整个函数test_function 。 因此,假设有一个堆栈然后bufferflag在我看到的大多数情况下,当你输入函数时,堆栈上会为对象分配空间,这假设没有任何类型的优化。

具有自动存储持续时间的对象未明确初始化,因此您无法确定首先需要分配给它们的初始值。

为了完整起见, C99标准草案第6.2.4节涵盖了各种储存期限1段的储存期限说明( 强调我的 ):

对象具有确定其生命周期的存储持续时间。 有三个存储持续时间:静态,自动和已分配 。 分配的存储在7.20.3中描述。

自动对象的生命周期包括第5段,其中说:

对于没有可变长度数组类型的此类对象,其生命周期从entry进入与其关联的块,直到该块的执行以任何方式结束。[…]