0

私はオブジェクトの配列を持っていStudentます。Student配列の長さを 100 に設定しましたが、有効なオブジェクトが 100 個ありません。Student配列を反復処理してすべての有効なオブジェクトを取得し、Student オブジェクトを持たない配列セルに到達したら停止できるようにしたいと考えています。

NULL最後の Student の後に配列 cellを入れてみましたが、 とif (queriedStudents[i])同様にチェックしましたif(queriedStudents[i] != NULL)が、どちらもうまくいきませんでした。

配列の使用済み部分の最後を見つける最良の方法は何ですか?

Student *Welcome::queryStudents(int *queries) {
    int query = 0;
    Student *matchedStudents[100];
    int matchedPos = 0;
    while (queries[query] > 0) {
        for (int i = 0; i < numStudents; i++) {
            if (allStudents[i]->id == queries[query]) {
                matchedStudents[matchedPos] = allStudents[i];
                matchedPos++;
            }
        }

        query++;
    }
    matchedStudents[matchedPos] = NULL;

    return *matchedStudents;
}

そして、各の値を出力しようとしている私のコードチャンクStudent:

        int i = 0;
        while (i < 100) {
            if (queriedStudents[i]) {
                cout << "ID:\t" << queriedStudents[i]->id << endl;
                cout << "Name:\t" << queriedStudents[i]->name << endl;
                cout << "Addr.:\t" << queriedStudents[i]->address << endl;
                cout << "Phone:\t" << queriedStudents[i]->phone << endl;
            } else {
                i = 100;
            }
            i++;
        }
4

1 に答える 1

3

もっと大きな問題があります。matchedStudents関数内のスタックで配列を宣言しますqueryStudents。制御がその関数から渡されると、配列はスコープ外に渡されます。後でそれを使用しようとしている場合 (配列の最初の要素であるポインターを使用して)、解放されたメモリをいじっていることになり、ほぼ確実に未定義の動作が発生します。まるで、最後にそこにいたときから所有者が変わった家を訪れているかのようです。何が変わったのか分からず、目を閉じてうろうろしていると大変なことになるかもしれません。

ヒープで配列を宣言できます。

Student **Welcome::queryStudents(int *queries) {
  Student **matchedStudents = new *Student[100];
    ...
  return matchedStudents;
}

または、参照渡しで渡します。

void Welcome::queryStudents(int *queries, Student **&matchedStudents) {
    ...
}

どちらの方法でも、有効なポインターの終わりを示す方法の問題に取り組むことができます。あなたの方法は実行可能に見えますが、@ JerryCoffinが指摘したようにstd::vector利用可能であることに注意してください。配列は苦痛であり、STL コンテナー ( などvector) は、これらの厄介な詳細を処理するために作成されました。最近では、配列を扱うことは、教育学以外にはほとんど役に立ちません。概念を理解するまでそれらを試してから、それらに基づいたより高度なコンテナーを使用してください。

于 2012-04-29T03:27:43.303 に答える