2017-08-10 70 views
-3

我無法運行我已分配修改的代碼。當將值分配給動態數組結構時,C++程序停止工作?

代碼正常工作,但我被要求測試代碼中的一個函數,所以我提供了一組數據,我會給函數測試輸出是否是所需的。

但是,每當我運行我的代碼時,會出現一個消息框,指出程序已停止工作。

下面的代碼的開頭:

int main(int argc, char *argv[]) 
{ 
    int nrMonsters; 
    cout << "Hello World!" << endl; 
    Monsters *monster[20]={0}; 


cout<<"Beginning of Test\n...\n"; 
//the first data set prepared for testing 
Monsters *date1[4]= {0}; 

//date1 - CC BB AA DD 
date1[0]->name="CC"; 
date1[1]->name="BB"; 
date1[2]->name="AA"; 
date1[3]->name="DD"; 
    for (int a=0;a<4;a++) 
    { 
    date1[a]->type=BALAUR; 
    date1[a]->health=10; 
    } 
cout<<"Set date1 initialised."; 

cout<<"\n\nSorting set date1...\t"; 
sortMonster(4,date1); 

這裏的結構是什麼:

enum MonsterTypes 
{ 
    UNDEFINED=-1, 
    VARCOLAC, 
    CAPCAUN, 
    PAIANJEN, 
    SPIRIDUS, 
    STRIGOI, 
    BALAUR 
}; 

struct Monsters 
{ 
    MonsterTypes type; 
    std::string name; 
    int health; 
}; 

這裏的功能的要求(它的意思是按字母順序排序):

void sortMonster(int number_of_monsters, Monsters **monster) 
{ 
/ /sorting 
} 

當我將鼠標懸停在第二個參數上方時,它顯示 「怪物怪物**」 但是當我在那裏的初始化代碼的頂部懸停,它讀取 ‘怪物* mosnter []’

有誰知道如何解決這一問題? 謝謝。

+4

釋放分配的內存'怪物*怪物[20]'你永遠不會爲分配內存任何這些指針。 – user0042

+0

'date1'是一個由四個空指針組成的數組。你解除引用。導致[*未定義的行爲*](http://en.cppreference.com/w/cpp/language/ub)。 –

+0

要麼創建「怪物變量」,並使指針指向這些對象(如果需要靜態對象),還要爲數組中的每個指針分配內存並訪問數組的元素(如果需要動態對象 - 這裏不要忘記釋放/在最後一次使用後刪除它們) –

回答

1

您必須分配內存。

Monsters *date1 = new Monsters[4]; 

或者使用C++風格malloc

不要忘記通過

delete []date1;  

free(date1); // if allocated with malloc/calloc 
+0

不要在'Monsters'上推薦使用'malloc'。使用'malloc'分配這些數組,會導致未定義的行爲(由於'std :: string'作爲成員,並且'malloc'不調用構造函數)。 –