Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我想动态生成结构数组,但出现堆损坏错误:_C++ - Fatal编程技术网

C++ 我想动态生成结构数组,但出现堆损坏错误:

C++ 我想动态生成结构数组,但出现堆损坏错误:,c++,C++,你好stackoverflow 所以我的问题是:我想创建一个函数来生成结构数组,但是每当我插入完值时,就会出现一个错误。问题是什么? 像这样 结构信息 { char name[20];//创建结构 智力年龄; }; 无效生成耳环(信息*p);//用于生成数组的函数 void readArr(信息*p);//一个读取数组的函数 int main() { INFO*ptr=new INFO;//指向结构的指针 generatearl(ptr);//调用函数 readArr(ptr); delete[

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

结构信息 { char name[20];//创建结构 智力年龄; }; 无效生成耳环(信息*p);//用于生成数组的函数 void readArr(信息*p);//一个读取数组的函数 int main() { INFO*ptr=new INFO;//指向结构的指针 generatearl(ptr);//调用函数 readArr(ptr); delete[]ptr;//释放内存 } 无效生成耳环(信息*p) { p=新信息[3];//生成三个信息结构 } 无效读卡器(信息*p) { 对于(int i=0;i<3;i++) { cin>>p[i].name>>p[i].age;//输入元素 cout此函数:

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

 }
未按预期工作。它将分配的内存分配给本地“p”参数,该参数不会返回到main。若要修复此问题,请将p更改为引用:

void generateArr(INFO *&p)
[编辑]

但是,由于您已经在main中使用
INFO*ptr=new INFO;
分配了
ptr
,这样会导致内存泄漏。因此,您应该删除该行。

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

您应该去掉无用的函数
generatearl(INFO*p)
,并将数组分配到
main()
,方法如下:

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

至少按照以下方式重写函数

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;
    }
}
至于你的代码,那么在这句话里

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
是函数的局部变量,该变量由函数的参数值初始化,退出函数后将被销毁。因此,动态分配的内存地址将丢失。

会出现什么错误?您只在
generatearl
。它对外部世界的影响与
void f(int x){x=0;}。在主程序中分配内存为<代码> PTR>代码>,并尝试在 GeaTAREARR <代码>中改写指针。如果它工作,那将是一个漏洞,但它不是因为值传递。这也是程序崩溃的原因, PTR < /C>只有1个元素的内存在<代码> RealARR> /Cord>。请停止尝试学习C++。经过反复尝试,你将一事无成。而是从一本好书中系统地学习它。堆损坏发生在你在…之后写入内存…很抱歉没有记住整个消息,我正在做其他事情。@Yankee2905并在
main
中删除
=new INFO;
,否则它会泄漏。
delete[]ptr; // deallocating memory
void generateArr(INFO *p)
{
    p = new INFO [3]; // generating three INFO structures
}