【问题标题】: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 - 那么请修复代码以使其更清晰以供其他人阅读?

标签: arrays stack


【解决方案1】:

你不能。而且你不应该关心变量在哪里,编译器无论如何都可以完全优化它们。

尽管它高度依赖于系统,但编译器通常只会在其他所有操作之后分配可变大小的数组,从那时起,它只是增加堆栈以为数组生成 ruum 的问题。如果编译器将变量放在该区域之后,则必须通过动态大小数组的大小间接访问它们。

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 2013-01-25
    • 2011-02-18
    • 2011-02-15
    • 2010-11-28
    • 2012-06-26
    • 2011-10-06
    • 2023-03-23
    相关资源
    最近更新 更多