当我运行此代码时:
#include <stdio.h>
int main() {
int x[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int y[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
int t;
for (t = 0 ; t < 22 ;t++){
printf( "%d\t\n", x[t]);
}
return 0;
}
由于某种原因,C将y数组连接到x数组上。有人可以解释为什么这样做吗?感谢。
答案 0 :(得分:3)
您的编译器将两个数组彼此相邻放置在程序的静态数据区域中。因为它们都由4字节值组成,所以它们在x86字边界上对齐,因此它们之间不会有填充。
无法保证此行为,您的代码依赖于未定义的行为:超出数组的范围。
答案 1 :(得分:2)
即使它发生以这种方式工作,你正在从它的边界访问一个数组,所以你有 Undefined Behavior (UB)。
UB可以采取任何形式,这里就是这样,(因为数组在内存中彼此相邻,但你不应该依赖它)。
答案 2 :(得分:0)
当为两个阵列分配内存时,它们碰巧被放置在连续内存位置的堆栈中。不能保证他们会以这种方式安排,但在这种情况下他们是。
在构建过程中,编译器和/或链接器决定将放置内存变量的位置。在这样一个简单的程序中,有一个很好的机会变量,它们在另一个之后被声明为一个,将在内存中彼此相邻放置。