2013-03-08 212 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