给出以下结构声明:
struct Student
{
char * name;
float gpa;
}
实施以下功能:
Student ** createStudentList(char ** names, int size);
上面的函数动态创建一个指向Student对象的指针数组。它分配Student对象并将它们的名称设置为传入“names”并将gpa设置为0.“size”是可用的“名称”数。该函数返回指向Student指针数组的指针。
bool destroyStudentList(Student ** studentList, int size);
上述函数删除数组中的所有Student对象及其动态分配的数据成员,例如name。它还释放指向Student对象的指针数组。如果操作成功,则该函数返回true;如果“studentList”包含nullptr,则返回false。
以下是我的功能:
Student ** createStudentList(char ** names, int size){
Student **studentList;
studentList = new Student*[size];
for (int i = 0; i < size; i++) {
studentList[i] = new Student;
studentList[i]->name = new char[strlen(names[i]+1)];
studentList[i]->name = names[i];
studentList[i]->gpa = 0;
}
return studentList;
}
bool destroyStudentList(Student ** studentList, int size) {
if (studentList = NULL)
return false;
else {
for (int i = 0; i < size; i++) {
delete [] studentList[i]->name;
studentList[i]->name = nullptr;
delete studentList[i];
studentList[i] = nullptr;
}
delete[] studentList;
return true;
}
}
看起来函数createStudentList
工作正常,但在尝试为delete [] studentList[i]->name;
&#34;访问冲突读取位置0x00000000&#34;取消分配内存时出错。 。为什么它会给我这个错误,我该如何解决?谢谢
答案 0 :(得分:2)
在createStudentList
:
...
studentList[i]->name = new char[strlen(names[i]+1)];
studentList[i]->name = names[i];
...
哎哟!您分配内存,然后放弃它并将name
指针设置为指向属于参数names
的内容。你不应该期望在你需要的时候这个东西仍然存在,并且根据你的错误消息判断它已经超出范围或被删除。
答案 1 :(得分:1)
你几乎就在那里,但你的createStudentList
功能有一些问题。首先,检查这一行的括号:
studentList[i]->name = new char[strlen(names[i]+1)];
它没有做你想做的事。
接下来,考虑一下这条线的确在做什么,
studentList[i]->name = names[i];
您是否正在尝试制作字符串的副本(您必须这样做,因为您正在为其分配内存)?如果是这样,请考虑另一条线。