0

我有一个Student对象数组。我将数组长度设置为 100,但其中没有 100 个有效Student对象。我希望能够遍历数组并获取所有有效Student对象,然后在到达没有 Student 对象的数组单元格时停止。

我曾尝试NULL在最后一个学生之后放入数组单元格,然后检查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 回答