我正在运行此C代码
#define STACKSIZE 65536
char d[STACKSIZE];
if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) {
Printf ("Stack space reservation failed\n");
Exit ();
}
printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d));
auto int a = 3;
printf("Now the stack pointer is on %d\n",&a);
我得到了输出 从-4262832分配到-4197296,因此对于65536字节 现在堆栈指针位于-4262836
这意味着变量“a”放在阵列后面的堆栈上。 但是如果我使用一个可变长度数组(一个长度在运行时设置的数组),我会得到相反的行为:a在数组之前放在堆栈上。
这是代码(它是相同的,但数组的大小是在运行时设置的)
#define STACKSIZE 65536
int i = 1;
char d[i*STACKSIZE];
if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) {
Printf ("Stack space reservation failed\n");
Exit ();
}
printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d));
auto int a = 3;
printf("Now the stack pointer is on %d\n",&a);
这是输出
从-4262856分配到-4197320,因此对于65536字节 现在堆栈指针在-4197312
上那么,问题是什么?我该如何解决它(使用可变长度数组并在其后放置变量)。
谢谢!
答案 0 :(得分:1)
你做不到。你不应该关心变量的位置,编译器无论如何都可以将它们优化得很好。
虽然它高度依赖于系统,但编译器通常只会在其他所有内容之后分配可变大小的数组,因为这只是增加堆栈以使数组失效的问题。如果编译器将变量放在该区域之后,则必须通过动态大小的数组间接访问它们。