I have an array of Student objects. I set the array length to 100, but it doesn’t have 100 valid Student objects in it. I want to be able to iterate through the array and grab all the valid Student objects, then stop when I get to an array cell that doesn’t have a Student object.
I have tried putting NULL into the array cell after the last Student, and then checking if (queriedStudents[i]) as well as if(queriedStudents[i] != NULL), but neither has worked for me.
What is the best way to find the end of the used part of my array?
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;
}
And my code chunk trying to print out each Student‘s values:
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++;
}
You’ve got a bigger problem. You declare the array
matchedStudentson the stack in the functionqueryStudents. When control passes out of that function, the array passes out of scope. If you’re trying to use it later (by means of the pointer it returns, which was the first element of the array) then you’re messing with deallocated memory, which will almost certainly lead to undefined behavior. It’s as if you’re visiting a house that has changed owners since you were last there; there’s no telling what’s changed, and if you wander around with your eyes closed you might get into trouble.You can declare the array on the heap:
Or pass it in by reference:
Either way, you can then tackle the problem of how to indicate the end of valid pointers. Your method looks feasible, but bear in mind that as @JerryCoffin has pointed out,
std::vectoris available. Arrays are a pain, and the STL containers (such asvector) were made to take care of these grubby details for you. These days working with arrays serves almost no purpose except pedagogy; play with them until you understand the concepts, then use more advanced containers which are base on them.