我有这个 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
我有几个问题
设置 numbers[10] 不会给出错误,因为数组的大小仅为 4,如果不是,那么为什么(因为它没有给出任何错误)
为什么打印 numbers[6] 给出垃圾值而 numbers[5] 给出值 0 ?它不应该也是一个垃圾值吗。
设置 numbers[10] 有什么影响,我知道它不会增加数组的大小,但它有什么作用呢?
提前致谢。 PS 我使用 GCC 来编译代码!!
最佳答案
- 这不会出错,您的数组是在堆栈上声明的,因此 number[10] 所做的是写入地址编号 + (10*sizeof int) 并覆盖那里的任何内容。
- 正如 Xymostech 所说,0 和 963180397 一样都是垃圾。打印 numbers[6] 将打印存储在地址 numbers + (6*sizeof int) 中的内容,所以这取决于你的程序是如何编译的,如果你已经声明数字前后的局部变量等。
- 参见答案 1。
你可以做的是:
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]) ;
现在您可以理解访问数字数组时覆盖的内容
关于超出数组大小的数组元素值的C数组设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772057/