我有以下代码,我真的不明白 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);
}
答案 0 :(得分:3)
各种C标准都没有提到堆栈,它所讨论的是存储持续时间有三种(静态,自动和分配)。在这种情况下,flag
和buffer
具有自动存储持续时间。在最常见的系统上,具有自动存储持续时间的对象将在堆栈上分配,但您不能普遍认为。
自动对象的生命周期在您输入范围时开始,在您离开范围时结束,在这种情况下,您的范围将是整个函数test_function
。因此,假设在我看到的大多数情况下都有一个堆栈buffer
和flag
,当你输入函数时,堆栈上会为对象分配空间,这假设没有任何优化排序
具有自动存储持续时间的对象未明确初始化,因此您无法确定首先需要为其分配的初始值。
为了完整起见,C99 draft standard部分涵盖了各种存储持续时间6.2.4
对象的存储持续时间段 1 表示(强调我的):
对象具有确定其生命周期的存储持续时间。有三个存储空间 持续时间:静态,自动和已分配。分配的存储在7.20.3中描述。
自动对象的生命周期涵盖 5 段,其中包含:
对于没有可变长度数组类型的对象,其生命周期会延长 从进入与之关联的块直到该块的执行结束 无论如何。[...]
答案 1 :(得分:1)
flag
,buffer
和a,b,c,d
将在堆栈中(编译器可能只删除所有代码并将其称为死代码,因为它未被使用)。