结束进程错误代码 -1,如果访问结构的字符串字段

End process error code -1 if acess to string field of structure

本文关键字:结构 字符串 字段 访问 如果 进程 错误代码 结束      更新时间:2023-10-16
#include <cstdlib>
#include <string>
#include <iostream>
#define S 10
using namespace std;
struct List
{
    string name;
    bool male;
    int year;
    string addr;
    string diag;
    bool hosp;
};
main()
{
    struct List *l=NULL;
    int n=0;
    for(int i=0;i<10000;i++)
    {
        if(!(n%S))
        {
            l=(List*)realloc(l,(n/S+1)*S*sizeof(struct List));
            cout<<"realloc okn";
        };
        l[n].male=rand()%2;
        l[n].year=1900+rand()%100;
        l[n].hosp=rand()%2;
        //!l[n].name="abc";
        n++;
        cout<<l[rand()%n].male<<" "<<l[rand()%n].year<<" "<<l[rand()%n].hosp<<endl;
    }
}

如果 l[n].name="abc" 注释,则程序工作正常。
如果我尝试将字符串值放到此字段,则程序编译时没有警告,但在第一次 realloc 后崩溃并显示错误代码 -1。有什么方法可以解决吗?

由于您的结构是非平凡的 - 它包含类类型的成员,std::string ,需要通过调用其构造函数来初始化 - 您不能简单地分配原始内存并假装包含有效对象。

最简单的解决方案是使用类型感知动态数组

std::vector<List> l;

可以调整大小,保留其内容,使用

l.resize((n/S+1)*S);

提示!使用"new"运算符分配此结构将自动为每个字段创建字符串对象。

List *l=new struct List[S];

它解决了这个问题,l[n].name="abc"可以工作,但它没有实现重新分配功能。