C- 数组末尾的神秘值

C- mystery value at the end of array

我想在数组末尾插入一个整数。但是,当我尝试执行代码时,随机值 (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;
}

您声明了一个大小为 upper (6) 的数组,但此处:

a[upper]=66;

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

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

未定义的行为就是 - 未定义。甚至弄清楚为什么会发生也没有意义。它完全 OS 和编译器相关。

您已将值 66 分配给数组的第 8 个元素(第 7 个索引),并且您正在从索引号 0 打印到 6th.So,第 6 个索引未被您分配任何值。所以,它是垃圾。如果你想在最后添加,然后将行 a[upper]=66 更改为 a[upper-1]=66.

像这样反转这两行:

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

你的代码应该没问题。