当前位置:  开发笔记 > 编程语言 > 正文

C中的奇怪堆栈行为

如何解决《C中的奇怪堆栈行为》经验,为你挑选了1个好方法。

我担心我误解了C中的堆栈行为.

假设我有以下代码:

int main (int argc, const char * argv[]) 
{
    int a = 20, b = 25;
    {
        int temp1;
        printf("&temp1 is %ld\n" , &temp1);
    }

    {
        int temp2;
        printf("&temp2 is %ld\n" , &temp2);
    }
    return 0;
}

为什么我在两个打印输出中都没有获得相同的地址?我得到的temp2离temp1只有一个int,好像temp1从未被回收过.

我的期望是堆栈包含20和25.然后将temp1放在顶部,然后将其删除,然后将temp2放在顶部,然后将其删除.

我在Mac OS X上使用gcc.

请注意,我使用-O0标志进行编译而不进行优化.

那些想知道这个问题的背景的人:我正在准备关于C的教材,我试图向学生们展示他们不仅应该避免从函数返回指向自动变量的指针,而且还要避免从中获取变量的地址嵌套块并在外部取消引用它们.我试图证明这是如何导致问题的,并且无法获得截图.



1> Norman Ramse..:

编译器完全有权优化temp1temp2进入同一位置.编译器一次为一个堆栈操作生成代码已经很多年了; 这些天整个堆栈框架一次性布局.(几年前,一位同事和我想出了一个特别聪明的方法.)天真的堆栈布局可能会将每个变量放在自己的插槽中,即使在您的示例中,它们的生命周期也不会重叠.

如果你好奇,你可能会得到不同的结果gcc -O1gcc -O2.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有