超出数组大小的数组元素值的C数组设置

标签 c arrays

我有这个 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

我有几个问题

  1. 设置 numbers[10] 不会给出错误,因为数组的大小仅为 4,如果不是,那么为什么(因为它没有给出任何错误)

  2. 为什么打印 numbers[6] 给出垃圾值而 numbers[5] 给出值 0 ?它不应该也是一个垃圾值吗。

  3. 设置 numbers[10] 有什么影响,我知道它不会增加数组的大小,但它有什么作用呢?

提前致谢。 PS 我使用 GCC 来编译代码!!

最佳答案

  1. 这不会出错,您的数组是在堆栈上声明的,因此 number[10] 所做的是写入地址编号 + (10*sizeof int) 并覆盖那里的任何内容。
  2. 正如 Xymostech 所说,0 和 963180397 一样都是垃圾。打印 numbers[6] 将打印存储在地址 numbers + (6*sizeof int) 中的内容,所以这取决于你的程序是如何编译的,如果你已经声明数字前后的局部变量等。
  3. 参见答案 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/

相关文章:

arrays - 替代 O(N^2) 时间复杂度和 O(1) 空间复杂度,用于在数组中查找不同的值

c++ - Arduino eInk Image2LCD - c 数组的大小

c - 结构体内部的动态结构体

c - 将字符串附加到动态字符数组的函数的 ACSL 规范

c - 尝试编写用于查找机器 epsilon 的代码

c - 为什么我的 Windows 进程句柄永远存在?

使用指针输入结构值时 scanf 函数中的混淆

C++数组类问题

python - NumPy 数组可以有值的元组吗?

arrays - 降低数组中最大重复元素的复杂性