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

+2

Начните с того, что вы пишете C или C++. Если вы пишете C, не используйте 'cin' или' cout' и не возвращайте return из 'malloc'. Если вы пишете C++, не используйте 'malloc' вообще и используйте' std :: vector' вместо вашей домашней прокатки. –

ответ

6

причина вы получаете сбой, потому что string str1;string str2; не создаются должным образом.

И они не построены должным образом, потому что malloc выделяет память и не вызывает конструкторы.

Какой оператор new предназначен для C++.

Поэтому, как отмечено в комментариях:

  1. Никогда не использовать malloc выделять объекты, не POD.
  2. Даже лучше, никогда не используйте malloc в C++ вообще.
  3. А еще лучше, никогда не использовать вручную выделенные массивы, использовать std::vector вместо
+0

+1 для этого последнего абзаца (ну и весь ответ тоже). – Cornstalks

+0

Я заменил 'malloc' на' new' в обеих строках, и он сработал – Roola

+0

@Roola. Но вы понимаете, что изменение этих двух 'malloc'' '' '' '' '' '' '' 'просто быстрое и грязное исправление для вашего кода и что там все больше и больше проблем? Вы сделаете это намного легче для своего будущего, если вы изучите * сейчас *, как сделать что-то на C++, вместо того, чтобы продолжать свой текущий стиль, до тех пор, пока вы не достигнете сложного комплекса проектов, где он терпит неудачу. – us2012

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

+0

@Roola Это было бы слишком общим. Указатели не являются изначально плохими, а некоторые вещи (использование деревьев или связанных списков) просто требуют указателей! На мой взгляд, разумным ориентиром является: Не используйте необработанные указатели, в которых подразумевается собственность на объект. Но это, вероятно, не будет означать для вас много, так что действительно, вам нужно получить хорошую и современную книгу на C++ и изучить этот материал с нуля. – us2012

+0

ладно, спасибо, я буду продолжать практиковать – Roola