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

时间:2013-09-16 18:12:55

标签: c variables stack segment

我有以下代码,我真的不明白 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);
}

2 个答案:

答案 0 :(得分:3)

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

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

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

为了完整起见,C99 draft standard部分涵盖了各种存储持续时间6.2.4 对象的存储持续时间 1 表示(强调我的):

  

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

自动对象的生命周期涵盖 5 段,其中包含:

  

对于没有可变长度数组类型的对象,其生命周期会延长   从进入与之关联的块直到该块的执行结束   无论如何。[...]

答案 1 :(得分:1)

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