为什么要将新结构放入重新分配的c数组崩溃程序

Why putting new structures into reallocated c-array crashes program?

本文关键字:分配 程序 新分配 崩溃 数组 新结构 结构 为什么      更新时间:2024-09-22

我想看看c数组是如何工作的。我用malloc(), calloc() and realloc().做了几个程序,每个程序都成功了,除了这个:

#include <iostream>
using namespace std;
struct student
{
string name;
string surname;
int age;
};
int main(){
student* arr = (student*)malloc(2*sizeof(student));
if(arr!=NULL){
for(int i = 0;i<2;i++){
student st;
cout<<"Enter name of "<<i+1<<". student: ";
cin>>st.name;
cout<<endl<<"Enter surname of "<<i+1<<". student: ";
cin>>st.surname;
cout<<endl<<"Enter age of "<<i+1<<". student: ";
cin>>st.age;
cout<<endl;
arr[i] = st;
}
for(int i = 0;i<2;i++){
cout<<"Name of "<<i+1<<". student: "<<arr[i].name<<endl<<endl;
cout<<"Surname of "<<i+1<<". student: "<<arr[i].surname<<endl<<endl;
cout<<"Age of "<<i+1<<". student: "<<arr[i].age<<endl<<endl;
}
cout<<endl<<"How many students would you like to add? ";
int additional_students;
cin>>additional_students;
arr = (student*) realloc(arr,(additional_students+2) * sizeof(*arr));
if(arr !=NULL){
for(int i = 2;i<2+additional_students;i++){
student st;
cout<<"Enter name of "<<i+1<<". student: ";
cin>>st.name;
cout<<endl<<"Enter surname of "<<i+1<<". student: ";
cin>>st.surname;
cout<<endl<<"Enter age of "<<i+1<<". student: ";
cin>>st.age;
cout<<endl;
//this line crashes the program
arr[i] = st;
}
for(int i = 0;i<2+additional_students;i++){
cout<<"Name of "<<i+1<<". student: "<<arr[i].name<<endl;
cout<<"Surname of "<<i+1<<". student: "<<arr[i].surname<<endl;
cout<<"Age of "<<i+1<<". student: "<<arr[i].age<<endl;
}
}
}
free(arr);
return 0;
}

我已经找了一个小时的解决方案,但我仍然不明白它为什么会崩溃。我发现,如果我把realloc(arr,(additional_students+2) * sizeof(*arr));中的值乘以500,它就会起作用。为什么?

除了错误的malloc实现之外,还有其他可以修复的错误。

for(int i = 0;i<2;i++){
student st;
cout<<"Enter name of "<<i+1<<". student: ";
cin>>st.name;
cout<<endl<<"Enter surname of "<<i+1<<". student: ";
cin>>st.surname;
cout<<endl<<"Enter age of "<<i+1<<". student: ";
cin>>st.age;
cout<<endl;
arr[i] = st;
}

制作新的学生对象只是为了将输入分配给它,然后将它转移到数组,这是不必要的,即使你已经完成了自定义"="操作员
试试这样的东西:

for(int i = 0; i < 2; i++){
cout << "Enter name of " << i + 1 << ". student: ";
cin >> arr[i].name;
cout << endl << "Enter surname of " << i + 1 << ". student: ";
cin >> arr[i].surname;
cout << endl << "Enter age of " << i + 1 << ". student: ";
cin >> arr[i].age;
cout << endl;
}

既然您已经为数组中的两个学生实例分配了空间,为什么还要创建另一个呢
同样的事情必须在第二个循环中完成。

如果malloc结构包含需要构造的C++类对象,则不能使用它。正如有人在评论中所说,mallocrealloconly分配内存,它们不构造结构本身(如果它有任何构造函数(或结构的成员(我说的是字符串成员(
如果您想使用mallocrealloc保持当前解决方案,请尝试使用char name[255]char姓氏[255]而不是现有的字符串成员。而且,正如我之前所说的那样,还要更改循环,因为这可能会导致不可预测的行为。

EDIT:或者只使用std::vector,这样可以正确构建所有内容。

工作代码,保留mallocrealloc

#include <iostream>
using namespace std;
struct student
{
char name[255];
char surname[255];
int age;
};
int main(){
student* arr = (student*)malloc(2*sizeof(student));
if(arr!=NULL){
for(int i = 0;i<2;i++){
cout<<"Enter name of "<<i+1<<". student: ";
cin>>arr[i].name;
cout<<endl<<"Enter surname of "<<i+1<<". student: ";
cin>>arr[i].surname;
cout<<endl<<"Enter age of "<<i+1<<". student: ";
cin>>arr[i].age;
cout<<endl;
}
for(int i = 0;i<2;i++){
cout<<"Name of "<<i+1<<". student: "<<arr[i].name<<endl<<endl;
cout<<"Surname of "<<i+1<<". student: "<<arr[i].surname<<endl<<endl;
cout<<"Age of "<<i+1<<". student: "<<arr[i].age<<endl<<endl;
}
cout<<endl<<"How many students would you like to add? ";
int additional_students;
cin>>additional_students;
arr = (student*) realloc(arr,(additional_students+2) * sizeof(*arr));
if(arr !=NULL){
for(int i = 2;i<2+additional_students;i++){
cout<<"Enter name of "<<i+1<<". student: ";
cin>>arr[i].name;
cout<<endl<<"Enter surname of "<<i+1<<". student: ";
cin>>arr[i].surname;
cout<<endl<<"Enter age of "<<i+1<<". student: ";
cin>>arr[i].age;
cout<<endl;
}
for(int i = 0;i<2+additional_students;i++){
cout<<"Name of "<<i+1<<". student: "<<arr[i].name<<endl;
cout<<"Surname of "<<i+1<<". student: "<<arr[i].surname<<endl;
cout<<"Age of "<<i+1<<". student: "<<arr[i].age<<endl;
}
}
}
free(arr);
return 0;
}
相关文章: