为什么要将新结构放入重新分配的c数组崩溃程序
Why putting new structures into reallocated c-array crashes program?
我想看看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++类对象,则不能使用它。正如有人在评论中所说,malloc和realloconly分配内存,它们不构造结构本身(如果它有任何构造函数(或结构的成员(我说的是字符串成员(
如果您想使用malloc和realloc保持当前解决方案,请尝试使用char name[255]和char姓氏[255]而不是现有的字符串成员。而且,正如我之前所说的那样,还要更改循环,因为这可能会导致不可预测的行为。
EDIT:或者只使用std::vector,这样可以正确构建所有内容。
工作代码,保留malloc和realloc
#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;
}
相关文章:
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 在程序变得低效之前,允许多少新的[]和删除[]分配是否有限制?
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- 在不释放所有动态分配的资源的情况下结束程序是否有风险
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 我应该在这个程序中使用静态内存分配还是动态内存分配
- C++ 错误的分配应用程序失败
- C++程序无法分配 int 数组?
- 我的移动分配操作程序重载的分段错误
- 使用没有堆内存分配的接口的框架应用程序?
- 程序终止,状态为 -1073741510 在 for 循环的中间,将输入分配给二维数组
- 如何将 QML 文件分配给主窗口/应用程序
- 我的程序运行良好,可以复制对象,但是当我使用复制分配(=)时,它仍然可以正常运行.为什么不给错误
- 将数据分配给了数组分配,但程序显示了以缓冲区超支的输出
- 在C++容器中,作为模板参数提供的分配器和作为构造函数参数提供的分配程序之间的区别
- C++动态分配程序崩溃
- 为Fortran可分配程序在C中分配内存
- C++编程分配程序以信号11终止