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