2017-06-21 105 views
-1

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

谁能告诉我为什么是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; 
} 
+1

你介意发布你的输出吗? –

+3

你正在模拟写出数组的边界。并阅读。 –

+0

这是未定义的行为。 – BLUEPIXY

回答

1

声明与大小upper阵列(6),但在这里:

a[upper]=66; 

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

+0

啊,明白了。谢谢。任何方式来重新定义新的边界数组? –

+0

@ArkaMukherjee是的,使用'calloc',然后系统地复制你的元素。 –

+1

不是我所知道的。使用malloc和realloc指针可以帮助您动态改变大小。或者声明一个新数组 – CIsForCookies

1

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

未定义的行为就是这样 - undefined。甚至不知道为什么会发生。它完全依赖于操作系统和编译器。

0

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

+2

数组中没有“第8个”元素。甚至没有第七个因素。 – Olaf

+0

将未定义行为的一个实例替换为另一个实例不是可靠的调试方式。 –

-2

反向这两行是这样的:

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

而且你的代码应该罚款。

+0

这不是真的 - 后续的for循环仍然会调用未定义的行为。 'upper = upper + 1;'没有什么值得推荐的。另外,'a [upper]'本身是超出界限的。 –

+1

这是完全错误的。 'a [upper]'仍然是一个尝试的越界访问,因为数组在C中是零索引的,声明是:'int a [upper];'。 –