动态分配struct指针数组

时间:2013-03-08 17:19:01

标签: c++ c

我试图在另一个struct中动态分配一个struct数组 这是代码段

我没有得到任何语法错误,但是一旦我尝试输入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);
}

2 个答案:

答案 0 :(得分:6)

您遇到崩溃的原因是string str1; string str2;无法正确构建。

它们构造不正确,因为malloc只分配内存而不调用构造函数。

C ++中的操作符new是什么。

因此,正如评论中所强调的那样:

  1. 永远不要使用malloc来分配非POD对象。
  2. 更好的是,永远不要在c ++中使用malloc
  3. 更好的是,永远不要使用手动分配的数组,而是使用std::vector代替

答案 1 :(得分: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());
}