2017-06-21 110 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];'。 –