数组末尾的C-神秘值

时间:2017-06-21 17:46:50

标签: c arrays random garbage

我试图在数组的末尾插入一个整数。但是,当我尝试执行代码时,随机值(47)显示在最后一个位置。即使我更改要插入的值,47也不会改变。 Output is this.

谁能告诉我为什么它是47?它是垃圾价值吗?我的代码如下: -

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
  int upper=6; 
  int a[upper];
  int i;
  for(i=0;i<upper;i++)
  {
    scanf("%d",&a[i]);
  }
  printf("The array before insertion is \n");
  for(i=0;i<upper;i++)
  {
    printf("%d \n",a[i]);
  }
  printf("\n The array after insertion is \n");
  upper=upper+1;
  a[upper]=66;
  for(i=0;i<upper;i++)
  {
    printf("%d \n",a[i]);
  }
  return 0;
}

4 个答案:

答案 0 :(得分:1)

你声明一个大小为upper(6)的数组,但是在这里:

a[upper]=66;

您尝试访问阵列的第8个位置(因为您在upper= upper + 1之前执行过) - 您不拥有的位置。你正在做的是UB,因此可以打印47或其他任何可能发生的事情

答案 1 :(得分:1)

您刚刚遇到的是未定义的行为,通过访问数组末尾的内存(当您将upper设置为7时)。您正在为第8个(索引7,超出边界元素)分配值,然后读取第7个元素(索引6,也超出边界),这恰好是垃圾。

未定义的行为只是 - undefined 。甚至没有必要弄清楚它为什么会发生。它完全取决于操作系统和编译器。

答案 2 :(得分:0)

您已为数组指定了值66到第8个元素(第7个索引),并且您正在从索引编号0到第6个索引进行打印。因此,第6个索引不会为您分配任何值。所以,它是垃圾。如果你想在最后添加,那么将a [upper] = 66更改为[upper-1] = 66。

答案 3 :(得分:-2)

像这样颠倒这两行:

a[upper]=66; 
upper=upper+1; 

你的代码应该没问题。