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