2013-03-08 147 views
0

我試圖動態分配結構的陣列中的另一個結構 這裏的陣列的動態分配的代碼段結構指針

我沒有得到任何語法錯誤,但我得到段錯誤當我嘗試進入STR1

有人能解釋一下爲什麼會出現分段錯誤,並且在這樣的情況在內存發生在動態分配什麼

struct A { 
    string str1; 
    string str2; 
} 

struct B { 
    int count; 
    A* A_array; 
} 


void GetB (B** b) 
{ 

*b = (B*) malloc(1*sizeof(B)); 
cout << "Enter count"; 
cin >> (**b).count; 
(**b).A_array = (A*) malloc((**b).count*sizeof(A)); 
cout << "Enter str1"; 
cin >> (**b).A_array[0].str1; 
cout << "Enter str2"; 
cin >> (**b).A_array[0].str2; 

} 

int main(){ 
    B* b; 
    GetB(&b); 
} 
+5

的C多麼可怕的混合和C++ – 2013-03-08 17:20:54

+1

是否有一個原因,爲什麼使用了'malloc',而不是'new'?通常,如果您使用C++進行編程,則需要實際使用C++。 – Cornstalks 2013-03-08 17:21:05

+2

從決定你是否在寫C或C++開始。如果你正在編寫C,不要使用'cin'或'cout',也不要使用'malloc'來返回。如果你正在編寫C++,根本不要使用'malloc',並且使用'std :: vector'而不是你的home-rolled模仿。 – 2013-03-08 17:21:53

回答

6

你得到一個崩潰的原因是因爲string str1;string str2;不能正確構建。

而且它們沒有正確構建,因爲malloc只分配內存並且不調用構造函數。

運算符new在C++中的用途是什麼?

因此,強調了評論:

  1. 永遠不要malloc分配非POD對象。
  2. 更好的是,從來沒有在C++中使用malloc
  3. 而更好的是,從來沒有使用手動分配的數組,使用std::vector代替
+0

最後一段+1(好,還有整個答案)。 – Cornstalks 2013-03-08 17:29:58

+0

我用兩個代碼中的'new'取代了'malloc',它的工作原理 – Roola 2013-03-08 18:08:57

+0

@Roola但是你明白將這兩個'malloc'改爲'new's只是對你的代碼的一個快速和髒的修復,是更多和更大的問題呢?如果你現在學習*如何使用C++方法來做事情,而不是繼續使用當前的風格,那麼你將使未來的自己更容易。 – us2012 2013-03-08 19:50:16

1

擴展在我的意見,這將是使用一些更地道的C++的當前程序中的等價物。我故意保持結構儘可能接近你的原始結構,但當然還有其他問題需要考慮,比如你的類是否應該有構造函數或私有成員。

struct A { 
    string str1; 
    string str2; 
}; 

struct B { 
    int count; 
    vector<A> A_vec; 
}; 

B GetB() 
{ 
    B myB; 
    cout << "Enter count"; 
    cin >> myB.count; 
    A a; 
    cout << "Enter str1"; 
    cin >> a.str1; 
    cout << "Enter str2"; 
    cin >> a.str2; 
    myB.A_vec.push_back(a); 
    return myB; 
} 

int main(){ 
    B b(GetB()); 
} 
+0

謝謝你的闡述。我注意到你沒有使用指針,你建議遠離C++指針 – Roola 2013-03-08 21:34:40

+0

@Roola這太普通了。指針本身並不壞,有些事情(實現樹或鏈表)只需要指針!在我看來,一個合理的指導原則是:不要在隱含對象所有權的情況下使用原始指針。但是,在這一點上,這對你來說可能並不意味着什麼,所以真的,你需要獲得一本關於C++的優秀和現代的書籍,並從頭開始學習這些東西。 – us2012 2013-03-08 21:45:44

+0

好的,謝謝我會繼續練習 – Roola 2013-03-08 22:17:59