2016-08-17 94 views
-1

我最近開始學習C++來改變我的職業生涯。使用結構創建數組

我理解了一些基本的指針邏輯,並且我想使用這個結構創建一個數組。

所以基本上,這裏是我寫到目前爲止代碼:

struct arr{ 
private: 
    int size; 
    int *elements; 
public: 
    void createarray(int start, int end); 
    void printa(); 
}; 
void arr::createarray(int start, int end){ 
size=end-start; 
for(int i=0;i<=size;i++){ 
    *(elements+i)=start+i; 
} 
} 

void arr::printa(){ 
    for(int i=0;i<=size;i++){ 
     cout << *(elements+i) << endl; 
    } 
} 

所以基本上,我的邏輯是: 如果我可以讓存儲在C++和隨機內存地址的指針變量執行增量指針算術,然後我可以基本上使用結構或類創建自己的數組符號。

但上面的代碼給了我一個錯誤。所以,我猜測這是因爲在c中對未初始化的指針執行算術是無效的。我對麼?還是有什麼我失蹤?

非常感謝。

+0

你得到了什麼樣的錯誤? – pomtree

+3

雖然很好的學習關於指針的知識,以及如何使用它們來創建動態「數組」,但一旦你學到了這一課,你就可以拋棄它,因爲每當你用C++編程時想到「動態數組」,你的下一個應該是[的std :: VECTOR'](http://en.cppreference.com/w/cpp/container/vector)。 –

+1

這裏沒有創建動態數組。像'new int [size];'必須遲早要在那裏,這樣可以將for循環的條件限制嚴格限制爲小於size。正如現在寫的,這是* undefined behavior *的一個配方,假設'arr'的一個實例是真正創建的(沒有發佈的代碼也沒有)。最後,「用未初始化的指針執行算術...」做*任何*,無論是指針算術,還是簡單的評估,都有*不確定*變量內容構成*未定義行爲*的最基本形式。 – WhozCraig

回答

0

這是你的代碼:

void arr::createarray(int start, int end){ 
    size=end-start; 
    for(int i=0;i<=size;i++){ 
     *(elements+i)=start+i; 
} 

首先,爲什麼不把它放在一個constructor呢?它是一個與結構體名稱相同的函數,並且沒有返回類型(甚至沒有void)。只要該類型的結構被實例化,就會調用它。其次,數組和指針在C中幾乎可以互換。 *(elements+i)也可以寫成elements[i]


你的問題是,你永遠不會爲elements分配內存。你正在做一個未初始化的指針的算術和賦值,這是未定義的行爲。你應該使用new關鍵字並給它一個大小。

elements = new int[size]; 

當你new的東西,你也必須delete它時,你就大功告成了。否則你會泄漏內存。 一個合理的位置在析構函數中(與構造函數相同,前綴爲~,但在結構實例死亡時調用)。

但是你不必擔心自己頭疼。 STL有一個容器可以做你想做的事。 std::vector

+2

數組和指針不像許多人想象的那樣可以互換。一個*在某些條件下衰減*,但這就是結束的地方。 – StoryTeller

1

您沒有爲動態數組分配任何內存。真的,它應該是這個樣子:

struct arr { 
private: 
    int size; 
    int *elems; 

public: 
    // createarray should be a constructor 
    arr(int start, int end) { 
     size = end - start + 1; 
     elems = new int[size]; 
     for (int i = 0; i < size; i++) 
      elems[i] = start + i; 
    } 

    // clean up memory 
    ~arr() { 
     // make sure to include the '[]' 
     delete[] elems; 
    } 

    // print array 
    void printa() { 
     for (int i = 0; i < size; i++) 
      std::cout << elems[i] << "\n"; 
    } 
}; 

當然,理想情況下,你會使用一個std::vector而不是滾動您自己的動態數組。

+0

非常感謝!我不知道這是可能的。所以你需要分配內存!看完代碼後,現在我明白了。 – daf