2015-07-10 78 views
2

我正在學習C語言。 當我將一個元素的數組值賦給另一個時,(看起來)奇怪的事情發生。 我的代碼如下。將數組的元素賦值給另一個時,意外的值包含

int main(void){ 
    int i =0; 
    char a2[] = "aaaa"; 
    char a1[] = "bbb"; 

    printf("%lu\n",sizeof(a2)); 
    printf("%lu\n",sizeof(a1)); 
    printf("%c\n",a2[4]); 
    printf("---\n"); 
    for(i =0; i < sizeof(a2); i++){ 
     a2[i]=a1[i]; 
     printf("%c\n", a2[i]); 
    } 
    printf("---\n"); 
    printf("%c\n", a2[4]); 

    return 0; 
} 

結果在下面。

 
5 
4 

--- 
b 
b 
b 

b 
--- 
b 

我不知道爲什麼 一個[4] A2 [4]值是 「B」。首先,我想如果我嘗試編譯這段代碼,編譯器會通過錯誤,但它說OK。 因此,我顯示結果,並看到a2 [4]元素包含「b」字符。 數組如何在C中工作?

我應該學習更深入理解機制的概念嗎?

+1

注意:在打印'size_t'值時,使用'「%zu」'而不是''%lu「'。 – chux

+0

注意:使用'char a2 [] =「abcd」; char a1 [] =「efg」;'很可能會促成更深入的理解。 – chux

+0

謝謝** chux **!我必須嘗試這種情況。 – csyouk

回答

6

因爲它已經指出,當你下面您將得到未定義的行爲:

for(i =0; i < sizeof(a2); i++){ 
    a2[i]=a1[i]; 
    printf("%c\n", a2[i]); 
} 

這是因爲a2大小爲5和a1大小爲4,所以你已經訪問a1a1[4])的第五個元素,它超出了數組範圍。因此,當你做a2[4] = a1[4]時,這是for循環的最後一次迭代所做的工作,因爲a1[4]的值沒有很好地定義,所以可以將任何值分配給a2[4]。因此,儘管a2[4]是數組中的有效元素,但您已將其指定給它的內容沒有很好定義,並且當您打印a2[4]時,您可以打印任何東西。請參閱最後一段,瞭解您最有可能得到的原因b

有幾件事情要記住這一點。第一個數組是基於零的索引,C中的第二個字符串是空終止的,因此sizeof("aa")其實是3不是2.

由於您的程序具有未定義的行爲,因此可以打印任何值,因爲任何值都可以在a1 [4]中。話雖如此,如果編譯器在a1之後立即放置數組a2,您將始終看到b已打印,因爲您在循環的第一次迭代中將值b指定爲a2[0]。這只是一個可能的解釋,爲什麼你看到一個b。編譯器不必將數組放在這個位置,實際上在我的機器上它不會將數組放在這個位置。這就是當行爲在C中未定義時的含義。

1

「爲什麼a[4]的值是"b"」不正確。 (當然,裝置OP這裏a2

注意的a2尺寸被打印爲5以下的不a2陣列邊界之外訪問。代替代碼簡單地打印空字符'\0'最初,然後....

char a2[] = "aaaa"; 
.... 
printf("%c\n",a2[4]); 

代碼進入未定義行爲與以下循環中最後一次迭代作爲a2[4] = a1[4];訪問a1以外的4 char大小。所以其餘的代碼行爲是undefined

char a1[] = "bbb"; 
... 
for(i =0; i < sizeof(a2); i++){ 
    a2[i]=a1[i]; 
    printf("%c\n", a2[i]); 
} 
相關問題