我有这个C代码段
int numbers[4]={1};
numbers[0]=1; numbers[1]=2; numbers[3]=3; numbers[10]=4;
printf("numbers: %d %d %d %d %d %d\n",numbers[0],numbers[1],numbers[3],numbers[6],numbers[10], numbers[5]) ;
此代码段的输出产生:
numbers: 1 2 3 963180397 4 0
我有几个问题
不设置数字[10]会给出错误,因为数组只有大小4,如果不是那么为什么(因为它没有给出任何错误)
为什么打印数字[6]给出了垃圾值,而数字[5]给出的值为0?它不应该是一个垃圾值。
设置数字[10]有什么影响我知道它不会增加数组的大小但它会做什么呢?
提前致谢。 PS我用GCC编译代码!!
答案 0 :(得分:2)
你可以做的是:
int empty[100];
int numbers[4]={1};
int empty2[100];
memset(empty, 0xCC, sizeof empty);
memset(empty2, 0xDD, sizeof empty2);
numbers[0]=1;numbers[1]=2;numbers[3]=3;numbers[10]=4;
printf("numbers: %d %d %d %d %d %d\n",numbers[0],numbers[1],numbers[3],numbers[6],numbers[10], numbers[5]) ;
现在,您可以了解在访问数字数组时覆盖的内容
答案 1 :(得分:1)
回答你的问题:
答案 2 :(得分:0)
它不会导致任何错误,因为它会被衰减为指针算法。
当您撰写numbers[10]
时,它只是numbers + 10 * sizeof(numbers)
,这是相当正确的。
访问您不想要的内存(未分配给您)是未定义的行为,因此您访问的每个索引都是垃圾,包括0
。
如上所述,访问大于4的索引不会增加数组的大小,此外,它也不会执行任何操作。