首页 > 解决方案 > C 相邻堆栈寻址

问题描述

C 编译器是否对元素在 c 堆栈上的放置提供任何保证,以便a[3]int a[2];执行 a 时访问,int b[2];例如:

int a[2];
int b[2];
a[3];

提供对 b[1] 的访问;但是通过使用“a”?

标签: cstack

解决方案


堆栈上局部变量的顺序完全取决于实现,并且实际上可以在添加或删除更多变量或更改编译器设置时更改。

例如:

#include <stdio.h>
   
int main()
{
    int x;
    char y;
    double z;

    printf("&x=%p\n", (void *)&x);
    printf("&y=%p\n", (void *)&y);
    printf("&z=%p\n", (void *)&z);
    return 0;
}

在 gcc 上编译时-O0

&x=0x7ffd15fa27ec
&y=0x7ffd15fa27eb
&z=0x7ffd15fa27e0

z是首先,然后y,然后x

编译时-O3

&x=0x7ffd87f4a4c4
&y=0x7ffd87f4a4c3
&z=0x7ffd87f4a4c8

y是首先,然后x,然后z

因此,即使在同一个编译器上,它也可能会有所不同。


推荐阅读