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