0

フィールドを含む構造がありstringます。これらの構造体の配列を作成し、それらを関数に (参照渡しで) 渡したいと考えています。フィールドをコメント アウトするとすべて問題なく動作しstringますが、コメント アウトしないとプログラムがクラッシュします。私はどこにもこれに対する答えを見つけることができません..

コードは次のとおりです(問題のみを表示するように縮小しました):

struct student {
    int a;
    int b;
    string name[20];
    char status;
};

void operation(student the_arr[1],int number_of_students) {
    delete[] the_arr;
    the_arr = new student[3];
    for(int i = 0; i<3; i++) {
        the_arr[i].a = i+5;
        the_arr[i].b = i+4;
    }   
}

int main() {    
    student *abc;
    abc = new student[0];
    operation(abc, 0);  
    system("pause");
    return 0;
}

必要に応じてサイズを変更できるように、配列を動的にする必要があります。

4

2 に答える 2

1

動的に割り当てられた配列の代わりに使用できないと仮定するとstd::vector、以下の答えに従ってください。それ以外の場合は、標準ライブラリが提供するコンテナを使用する必要があります。

注: プログラムはクラッシュしません。コンパイラが文句を言うのはそのallocating zero elements部分だけですが、このプログラムをコンパイルして実行できるようにします。

あなたの機能は完全に間違っています。動的割り当てを使用する場合、次のようにポインターを渡すだけです。

void operation(student* the_arr, int number_of_students) {

次に、関数内で、参照によって渡されないポインター内に格納されるメモリを動的に割り当ててthe_arrいるため、実行後にポインターを失うローカルポインター変数が作成されます。

void operation(student*& the_arr [...]

ただし、以下の解決策を避け、代わりに新しいポインターを返すことをお勧めします。

student* operation(student* the_arr, int number_of_students) {
    delete[] the_arr;
    the_arr = new student[3];
    [...] 
    return the_arr; // <----
}

割り当てabc = new student[0];ても意味がありません。0 要素の配列を割り当てようとしています。多分あなたは意味しましたabc = new student[1];か?

于 2013-03-22T16:38:26.723 に答える
0

ベクターまたはその他のシーケンス オブジェクトを使用する必要があります。あなたのコードで何をしようとしているのかはわかりませんが。簡単な例を次に示します。

// Vector represent a sequence which can change in size
vector<Student*> students;

// Create your student, I just filled in a bunch of crap for the
// sake of creating an example
Student * newStudent = new Student;
newStudent->a = 1;
newStudent->b = 2;
newStudent->name = "Guy McWhoever";
newStudent->status = 'A';

// and I pushed the student onto the vector
students.push_back( newStudent );
students.push_back( newStudent );
students.push_back( newStudent );
students.push_back( newStudent );
于 2013-03-22T16:41:48.247 に答える