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);
}
4

2 回答 2

6

您遇到崩溃的原因是因为string str1; string str2;没有正确构建。

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

这就是newC++ 中运算符的用途。

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

  1. 永远不要malloc用于分配非 POD 对象。
  2. 更好的是,永远不要malloc在 c++ 中使用。
  3. 更好的是,永远不要使用手动分配的数组,std::vector而是使用
于 2013-03-08T17:25:17.167 回答
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());
}
于 2013-03-08T21:16:40.700 回答