2016-07-21 84 views
-3

我是一位Java程序員,在C++中處理我的第一個項目,我很努力地理解數組是如何處理的。我正在嘗試編寫一個與下面的代碼結構相同的程序。然而在我的實際項目中,class Astruct B在頭文件中聲明。我明白這一點的是,b.arr[2]陳述將數組b.arr初始化爲長度2.但是,當我按原樣運行以下代碼時,出現錯誤exited with non-zero status。當我將b.arr [1]等於a2的行註釋掉時,它運行良好。爲什麼會這樣,我該怎麼做?另外,有沒有辦法可以將b.arr數組重新定義爲不同的長度?我環顧四周,但我找不到似乎解決這個具體問題。C++定義對象數組的元素

class A {}; 

struct B { 
    A *arr[]; 
}; 

int main() { 
    B b; 
    b.arr[2]; // instantiates array to be of length 2? 
    A a1; 
    A a2; 
    b.arr[0] = &a1; 
    b.arr[1] = &a2; // RUNS FINE WITHOUT THIS LINE 
} 

謝謝!

順便說一句,我正在寫一個arduino庫,所以我不能使用標準命名空間。

+3

請閱讀[書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list),不要只是嘗試隨機的東西。在C++中有這種叫做未定義行爲的東西,如果你不小心,可能會導致快速啓動器跳過你的窗口 – user463035818

+0

'b.arr [2]'是未定義的行爲。訪問尚未分配的數組的元素3。 –

+0

如果你想創建一個可以在運行時設置或更改大小的動態數組,你應該使用['std :: vector'](http://en.cppreference.com/w/cpp/container/vector )。如果你想要一個大小固定的數組,我建議['std :: array'](http://en.cppreference.com/w/cpp/container/array)。 –

回答

1
b.arr[2]; // instantiates array to be of length 2? 

這是不正確的。

它引用數組的第三個元素,並且不對元素的值做任何事情。

該程序調用未定義的行爲,因爲您在訪問b.arr時未初始化爲指向有效內存的元素。

+0

爲什麼它會將該行註釋掉? –

+1

@ user3451141,試圖理解未定義的行爲是毫無意義的。 –

+0

@ user3451141閱讀關於未定義的行爲。它看起來好像是有效的,但是迅猛龍已經潛伏在角落:P – user463035818

0
b.arr[2]; 

這已經是未定義的行爲。訪問尚未分配的內容。這意味着所有的投注都關閉了,你不能依靠任何代碼來以任何特定的方式行事。

如果要存儲A指針,請嘗試類似於std::vector<A*>std::array<A*>的靜態長度容器。

+0

我正在爲arduino寫這篇文章,所以我不能使用std命名空間。我最初忘了提及這個,但我做了一個編輯。雖然謝謝! –