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

时间:2012-12-07 22:30:11

标签: 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. 不设置数字[10]会给出错误,因为数组只有大小4,如果不是那么为什么(因为它没有给出任何错误)

  2. 为什么打印数字[6]给出了垃圾值,而数字[5]给出的值为0?它不应该是一个垃圾值。

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

  4. 提前致谢。 PS我用GCC编译代码!!

3 个答案:

答案 0 :(得分:2)

  1. 这不会出错,你的数组是在堆栈上声明的,所以[10]的数字是写在地址编号+(10 * sizeof int)并覆盖那里的任何内容。
  2. 正如Xymostech所说0可以和963180397一样多的垃圾。打印数字[6]将打印存储在地址编号+(6 * sizeof int)的内容,因此它取决于程序的编译方式,如果已声明数字之后的局部变量等
  3. 见答案1.
  4. 你可以做的是:

    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)

回答你的问题:

  1. 不一定。如果您静态地声明了数组,或者您可能刚刚覆盖堆栈上的数组之后的任何其他内容,编译器可以以更大的块保留内存。
  2. 这取决于编译器并属于“未定义的行为”。
  3. 您将(数字+10)设置为等号后的值。

答案 2 :(得分:0)

它不会导致任何错误,因为它会被衰减为指针算法。

当您撰写numbers[10]时,它只是numbers + 10 * sizeof(numbers),这是相当正确的。

访问您不想要的内存(未分配给您)是未定义的行为,因此您访问的每个索引都是垃圾,包括0

如上所述,访问大于4的索引不会增加数组的大小,此外,它也不会执行任何操作。