【发布时间】:2010-12-23 11:04:03
【问题描述】:
我正在运行这个 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
那么,问题出在哪里?我该如何解决它(使用可变长度数组并将变量放在堆栈之后)。
谢谢!
【问题讨论】:
-
能否请您格式化代码并放入适当的标签以指示哪种语言。如果是 C,则没有带有大写 P 的 Printf - 那么请修复代码以使其更清晰以供其他人阅读?