分配和删除指针数组
Allocate and dellete array of pointers
给定以下结构声明:
struct Student
{
char * name;
float gpa;
}
实现以下功能:
Student ** createStudentList(char ** names, int size);
上述函数动态创建了指向 Student 对象的指针数组。它分配Student对象并将它们的名称设置为传入的“names”和gpa为0。“size”是“names”的数量available.The函数returns指向Student指针数组的指针。
bool destroyStudentList(Student ** studentList, int size);
上述函数删除数组中的所有 Student 对象及其动态分配的数据成员,例如 name。它还释放指向 Student 对象的指针数组。函数 returns 如果操作成功则为真,如果“studentList”包含 nullptr 则为假。
这是我的功能:
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;
"Access violation reading location 0x00000000" 释放内存时出现错误。为什么它会给我这个错误,我该如何解决?谢谢
在createStudentList
中:
...
studentList[i]->name = new char[strlen(names[i]+1)];
studentList[i]->name = names[i];
...
哎呀!您分配内存,然后放弃它并设置 name
指针指向属于参数 names
的内容。你不应该期望那个东西在你需要它的时候仍然存在,并且根据你的错误消息判断它已经超出范围或被删除。
您快完成了,但是您的 createStudentList
功能存在一些问题。首先,检查这一行的括号:
studentList[i]->name = new char[strlen(names[i]+1)];
它并不完全符合您的要求。
接下来想想这行到底是干什么的,
studentList[i]->name = names[i];
您是否正在尝试复制该字符串(您必须这样做,因为您正在为其分配内存)?如果是这样,再考虑一下这条线。
给定以下结构声明:
struct Student
{
char * name;
float gpa;
}
实现以下功能:
Student ** createStudentList(char ** names, int size);
上述函数动态创建了指向 Student 对象的指针数组。它分配Student对象并将它们的名称设置为传入的“names”和gpa为0。“size”是“names”的数量available.The函数returns指向Student指针数组的指针。
bool destroyStudentList(Student ** studentList, int size);
上述函数删除数组中的所有 Student 对象及其动态分配的数据成员,例如 name。它还释放指向 Student 对象的指针数组。函数 returns 如果操作成功则为真,如果“studentList”包含 nullptr 则为假。
这是我的功能:
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;
"Access violation reading location 0x00000000" 释放内存时出现错误。为什么它会给我这个错误,我该如何解决?谢谢
在createStudentList
中:
...
studentList[i]->name = new char[strlen(names[i]+1)];
studentList[i]->name = names[i];
...
哎呀!您分配内存,然后放弃它并设置 name
指针指向属于参数 names
的内容。你不应该期望那个东西在你需要它的时候仍然存在,并且根据你的错误消息判断它已经超出范围或被删除。
您快完成了,但是您的 createStudentList
功能存在一些问题。首先,检查这一行的括号:
studentList[i]->name = new char[strlen(names[i]+1)];
它并不完全符合您的要求。
接下来想想这行到底是干什么的,
studentList[i]->name = names[i];
您是否正在尝试复制该字符串(您必须这样做,因为您正在为其分配内存)?如果是这样,再考虑一下这条线。