2013-04-06 74 views
0

我創建了兩個類,Class和Students。在類的構造函數中,我需要動態地初始化指向Student對象的指針數組(pStudents)(我不能使用矢量),初始化爲null。當我使用函數addStudent將一個學生添加到類中時,我希望能夠搜索第一個空地址的指針數組,然後將該學生分配給該數組中的該點。如果學生已經在課堂上,我也希望能夠搜索該課程,看看這個學生是否已經在那裏。向數組添加指針時出現分段錯誤

當我嘗試編譯程序時,出現分段錯誤。我知道它與我在創建pStudents數組時使用堆內存的方式有關,但我不確定如何解決此問題。

下面是我已經宣佈在類的頭文件的數組:

Student **ptrStudents; 

這是Class對象的構造函數。現在,我使用數組的任意大小40。

Class::Class() 
{ 
Student **ptrStudents = new Student*[40]; 
} 

這裏是函數addStudents,它將一個指向學生對象的指針作爲它的參數。請注意,字符串名稱是所有學生的數據字段。

Class::addStudents(Student *student) 
{ 

string name = student -> getName(); 
string nameTemp; 

for (int i = 0; i < 40; i++) 
{ 
    if (ptrStudents[i] != 0) 
    { 
     nameTemp = ptrStudents[i] -> getName(); 
     if (name == nameTemp) 
     { 
     cout << "This student is already in the class." << endl; 
     return; 
     } 
    } 

else if (ptrStudents[i] == 0) 
{ 
     ptrStudents[i] = student; 
     return; 
} 

這裏是我的工作主要功能:

int main() 
{ 
    Class Economics; 
    Student student1("Hannah"); 
    Economics.addStudent(&student1); 

    return 0; 
} 
+1

什麼是'ptrFlights [I]'? – YankeeWhiskey 2013-04-06 18:46:33

+0

當你編譯或者運行時,你會遇到段錯誤嗎?你的意思是編譯時出錯了嗎? – 2013-04-06 18:48:10

+0

對不起,修正了我的錯字給ptrStudents。我應該更清楚,這是我運行程序的時候。它會編譯但不能正確運行(我正在運行的編輯器將兩個步驟結合在一起)。 – 2013-04-06 18:51:34

回答

0

需要初始化每個指針數組爲NULL英寸將您的構造函數更改爲:

Class::Class() 
{ 
ptrStudents = new Student*[40]; 
for(int i = 0; i < 40; i++) 
    ptrStudents[i] = 0; //NULL 
} 

當您創建指針時,它不會自動初始化爲NULL。所以,發生了什麼事是你必須的垃圾數據一堆隨機指針,當你到達線

if (ptrStudents[i] != 0) 

他們都通過,因爲他們沒有空,即使它們是不可用的。

哎呀,我錯過了一個大的,即使當我複製你的代碼(謝謝你,約翰)。你不應該重新聲明ptrStudents數組;在構造函數中創建一個本地數組,而不是初始化成員數組。

+0

我已經嘗試做到這一點,不幸的是仍然得到一個錯誤。 – 2013-04-06 18:52:10

+0

@ JesseP_613這是因爲你的其他錯誤。閱讀其他答案。 – john 2013-04-06 18:52:37

+0

我的歉意,我的第一個答案引導你錯了。我忽略了你在構造函數中重新聲明數組的事實。 – 2013-04-06 18:55:16

0

在類頭中聲明的數組永遠不會被初始化。

Student **ptrStudents = new Student*[40];

聲明一個局部變量,並與新的數組初始化。

將其更改爲:

ptrStudents = new Student*[40];

0

至少有兩個錯誤

首先你應該initalise你的陣列值NULL(帕克肯普說)

其次,你已經聲明的局部變量在你的構造函數中被稱爲ptrStudents,其中隱藏了這個類變量也被稱爲ptrStudents。你應該刪除該聲明。所以,像你證明什麼

Class::Class() 
{ 
    Student **ptrStudents = new Student*[40]; 
} 

聲明瞭一個新的Student **ptrStudents猜想這個

Class::Class() 
{ 
    ptrStudents = new Student*[40]; 
    for(int i = 0; i < 40; i++) 
     ptrStudents[i] = 0; 
} 
0

。要初始化成員ptrStudents,您不必聲明它。它已經被宣佈。

你想要的是

Class::Class() 
{ 
    ptrStudents = new Student*[40]; 
}