堆栈上的分配顺序
Posted
技术标签:
【中文标题】堆栈上的分配顺序【英文标题】:Allocation order on the stack 【发布时间】: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 - 那么请修复代码以使其更清晰以供其他人阅读? 【参考方案1】:你不能。而且你不应该关心变量在哪里,编译器无论如何都可以完全优化它们。
尽管它高度依赖于系统,但编译器通常只会在其他所有操作之后分配可变大小的数组,从那时起,它只是增加堆栈以为数组生成 ruum 的问题。如果编译器将变量放在该区域之后,则必须通过动态大小数组的大小间接访问它们。
【讨论】:
以上是关于堆栈上的分配顺序的主要内容,如果未能解决你的问题,请参考以下文章