2012-12-11 76 views
-3

我試圖追加兩個數組在一起。當附加到第二個陣列{3, 4, 5}時,第一個陣列{0, 1, 2}應該產生{0, 1, 2, 3, 4, 5}。讓我告訴你我之前所擁有的東西:std :: cout在一個while循環中的奇怪行爲

#include <iostream> 

int main() { 

    int i = 0; 

    int arr1[] = {3, 4, 5}, arr2[] = {0, 1, 2}; 

    while (i < 3) { 
     arr2[3 + i] = arr1[i]; 
     i++; 
    } 

    std::cout << std::endl; 

    for (int i = 0; i < 6; i++) std::cout << arr2[i] << std::endl; // print 

} 

我認爲我實施它的方式是正確的。但我發現,當我打印出來的新陣列(arr2)的內容,這就是我得到:

0 
1 
2 
-1219315227 
-1218166796 
134514640 

0, 1, 2是原始數組,但隨後3, 4, 5有一些如何變成了這些奇怪的數字。然而,這在某種程度上固定我在while循環在這裏添加任意std::cout聲明:

... 
while (i < 3) { 
    std::cout << 5 << '\n'; // just a random # 

    arr2[3 + i] = arr1[i]; 
    i++; 
} 
... 

我再次打印陣列和它的作品!:

5 

0 
1 
2 
3 
4 
5 

我的問題是爲什麼當我在while循環中使用std::cout語句而不是不這樣做時,這個工作是正常的,在這種情況下它給了我那些數字?

編輯:

因此,原來我在這裏是不確定的行爲。因此,我的問題仍然存在:爲什麼我的代碼在while循環中使用std::cout調用?

+4

您正在索引第二個數組的長度。我認爲這是UB? – Borgleader

+0

@Borgleader,確實如此。 – chris

+0

執行此操作的簡單方法是使用'std :: vector'。只需使用「插入」。 – chris

回答

7

你超越的arr2這裏的界限:

while (i < 3) { 
    arr2[3 + i] = arr1[i]; 
    i++; 
} 

arr2有大小3.你在做什麼是不確定的行爲。所有觀察到的行爲都與未定義的行爲一致。

+0

我的問題是爲什麼它在while循環內用'std :: cout'輸出正確的數字。 – 0x499602D2

+4

@David因爲它是未定義的行爲。任何事情都可能發生。 – juanchopanza

+0

因爲它是未定義的行爲。轉移的東西是純粹的愚蠢的運氣,並可能由於其他更改隨時再次失敗。修復錯誤。 – Donnie

1

當你聲明你的第二個數組,像這樣:

arr2[] = {0, 1, 2}; 

你給它的界限之外的尺寸3.寫作是不確定的行爲。

+0

你沒有回答這個問題。爲什麼當我在while循環中放入一個'std :: cout'語句時它工作正常。 – 0x499602D2

+1

沒關係。未定義的行爲是未定義的行爲。編譯器可以隨意做任何事情。 –

+0

@大衛:是的。未定義的行爲就是驚喜行爲。我們不能告訴你它爲什麼有效,因爲這是一個意外。它不能保證工作,這只是運氣。 – Borgleader

0

你這裏是什麼未定義行爲

問題是,arr2分配只有3項,和你正在編寫分配後的空間:

while (i < 3) { 
    arr2[3 + i] = arr1[i]; 
    i++; 
} 

你需要分配更多的空間對於數組,或者在堆上分配它,所以你可以使用realloc函數來改變它的大小 - 或者甚至更好,更多的C++ - ish - 使用std::vector<int>