我想动态地创建一个结构数组,但是我遇到了堆损坏错误:

时间:2017-01-02 15:11:21

标签: c++

Hello stackoverflow 所以我的问题是:我想创建一个函数来生成结构数组,但每当我完成插入值时我会得到一个错误是什么问题? 像这样

  struct INFO
{
    char name[20]; // creating the strucure
    int age;

};
void generateArr(INFO *p); // a function to generate the array
void readArr(INFO *p);    // a function to read the array
int main()
{

    INFO *ptr =new INFO; // a pointer that points to the structure
    generateArr(ptr);  // calling the functions
    readArr(ptr);
    delete[]ptr; // deallocating memory

}
void generateArr(INFO *p)
{
    p = new INFO [3]; // generating three INFO structures

 }
void readArr(INFO *p)
{
    for (int i = 0; i < 3; i++)
    {

        cin >> p[i].name>> p[i].age; // inputting the elements
        cout << endl;
    }

}

我试图让代码尽可能清晰,问我是否有任何含糊不清。

3 个答案:

答案 0 :(得分:0)

此功能:

void generateArr(INFO *p)
{
    p = new INFO [3]; // generating three INFO structures

 }

无法正常工作。它将分配的内存分配给本地'p`参数,该参数不会返回到main。要修复它,请将p更改为引用:

void generateArr(INFO *&p)

[编辑]

但是由于您已经在ptr的main中分配了INFO *ptr =new INFO;,因此您将以这种方式获得内存泄漏。所以你应该删除那一行。

答案 1 :(得分:0)

generateArr(INFO *p)中,您分配一个数组,该地址存储在本地变量p中;从函数返回时,任何局部变量(例如p)都会丢失,只要分配的数组的地址。

你应该摆脱没用的函数generateArr(INFO *p),并以这种方式将你的数组分配到main()

int main()
{
    INFO *ptr =new INFO[3];
    readArr(ptr);
    delete[]ptr; // deallocating memory
}

答案 2 :(得分:0)

至少以下列方式重写功能

INFO * generateArr( size_t n )
{
    return new INFO [n]; // generating three INFO structures
}

void readArr(INFO *p, size_t n )
{
    for (int i = 0; i < n; i++)
    {

        cin >> p[i].name>> p[i].age; // inputting the elements
        cout << endl;
    }
}

并且主要称他们为

const size_t N = 3;

INFO *ptr = generateArr( N ); // a pointer that points to the structure
readArr( ptr, N );
delete []ptr; // deallocating memory

关于你的代码,然后在本声明中

INFO *ptr =new INFO; // a pointer that points to the structure

只分配了一个结构类型的对象,但是使用运算符delete []而不是运算符delete删除它。

delete[]ptr; // deallocating memory

在这个功能里面

void generateArr(INFO *p)
{
    p = new INFO [3]; // generating three INFO structures
}

存在内存泄漏,因为变量p是函数的局部变量,该函数由函数的参数值初始化,并且在退出函数后将被销毁。结果,动态分配的内存的地址将丢失。