1

I have this following code and I don't really understand which variable parts in the test_function are stored onto the stack segment?

In the book it says "The memory for these variables is in the stack segment", so I presume it is when the variables are actually initialized to a value. Right?

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);
}
4

2 回答 2

3

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

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

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

为了完整起见, C99 标准草案标准部分6.2.4 存储持续时间1段中涵盖了各种存储持续时间(强调我的):

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

自动对象的生命周期包含在第5段中,它说:

对于这样一个没有可变长度数组类型的对象,它的生命周期从进入与其关联的块开始,直到该块的执行以任何方式结束。 [...]

于 2013-09-16T18:17:57.130 回答
1

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

于 2013-09-16T18:17:42.160 回答