所以我有这个程序可以打印每个变量的地址并更改整数数组“a”的值。当 SOMETHING 为 4 时,打印的值符合预期。但是,当我将 SOMETHING 更改为 5 时,i 的值更改为 40,如果它存在的话,这就是 a[4] 的值。为什么要这样做?
#define SIZE 4
#define SOMETHING 4
int index = 0;
int i;
int k = 10;
int a[SIZE] = {0, 0, 0, 0};
int j = 10;
printf("Address of the variables:\n");
printf("%lx -> &j\n", (unsigned long)&j);
for (index = 0; index < SIZE; index++) {
printf("%lx -> &a[%d]\n", (unsigned long) &a[index], index);
}
printf("%lx -> &k\n", (unsigned long)&k);
printf("%lx -> &i\n", (unsigned long)&i);
printf("\n");
printf("Initial values: ");
printf("i = %d, j = %d, k = %d\n", i, j, k);
printf("a = {%d, %d, %d, %d}\n", a[0], a[1], a[2], a[3]);
printf("\n");
for (i = 0; i < SOMETHING; i++) {
a[i] = i * 10;
printf("i = %d, j = %d, k = %d\t\t", i, j, k);
printf("a = {%d, %d, %d, %d}\n", a[0], a[1], a[2], a[3]);
}
return 0;
最佳答案
越界访问数组将调用 undefined behavior .结果可以是任何。
在您的例子中,数组 a
有 4 个 (SIZE
) 元素,因此有效索引将为 [0,3]。所以,
如果
SOMETHING
是 4,你有for (i = 0; i < 4; i++)
将索引限制为
3
。OTOH,如果您将
SOMETHING
设为 5,则您有for (i = 0; i < 5; i++)
实际上尝试访问超出内存限制的
a[4]
,创建 UB。
FWIW,要打印地址,请使用 %p
格式说明符并将参数转换为 void*
。
关于C - 超出索引元素的地址与整数相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35638573/