C相邻堆栈寻址

C相邻堆栈寻址,c,stack,C,Stack,C编译器是否提供了在C堆栈上放置元素的任何保证,以便在inta[2]中访问a[3]当a通过intb[2]进行时例如: int a[2]; int b[2]; a[3]; #include <stdio.h> int main() { int x; char y; double z; printf("&x=%p\n", (void *)&x); printf("&y=%p\n&qu

C编译器是否提供了在C堆栈上放置元素的任何保证,以便在
inta[2]中访问
a[3]
当a通过
intb[2]进行时例如:

int a[2];
int b[2];
a[3];
#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;
}

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

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

例如:

int a[2];
int b[2];
a[3];
#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;
}
z
先是,然后是
y
,然后是
x

使用
-O3
编译时:

&x=0x7ffd87f4a4c4
&y=0x7ffd87f4a4c3
&z=0x7ffd87f4a4c8
y
先是,然后是
x
,然后是
z


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

请注意,[-2]似乎在ClangCompiler中工作,编译器可能会因为对齐原因而重新安排位置。没有保证。没有保证,编译器或优化器可能会在任何时候使用nuke
a[-2]
,我可以理解为什么在您发布的示例中,由于使用了不同的类型,它们会进行对齐优化,但是在前面的示例中,如果它们都使用相同的类型,这种情况还会发生吗?i、 e a和b都有相同的类型。@thysultan可能有,可能没有。不管怎样,你都不应该依赖它。