C - 超出索引元素的地址与整数相同

标签 c arrays loops

所以我有这个程序可以打印每个变量的地址并更改整数数组“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/

相关文章:

c++ - 数组中的唯一整数

python - 只检查循环语句一次

python - 在 Selenium/Python 中循环遍历 div 中的 div

c - 在文件中查找N个字母的单词

c - 将字符串分配给结构中的 char 值

c++ - 使用按位运算符检查数字是正数还是负数

c - 如何在 C 中将 int 转换为字符串 (char*)

java - 打印 3D 数组转换为 2D

python - 如何使用 Python 输出嵌套循环的结果

C 程序 - 文件处理限制