堆栈上的分配顺序

时间:2009-12-05 00:26:39

标签: arrays stack

我正在运行此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

那么,问题是什么?我该如何解决它(使用可变长度数组并在其后放置变量)。

谢谢!

1 个答案:

答案 0 :(得分:1)

你做不到。你不应该关心变量的位置,编译器无论如何都可以将它们优化得很好。

虽然它高度依赖于系统,但编译器通常只会在其他所有内容之后分配可变大小的数组,因为这只是增加堆栈以使数组失效的问题。如果编译器将变量放在该区域之后,则必须通过动态大小的数组间接访问它们。