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また、メモリを割り当てるだけでコンストラクターを呼び出さないため、適切に構築されません。

これはnew、C++での演算子の目的です。

したがって、コメントで強調表示されているように:

  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 に答える