定义了一个类goods的二级指针,并且new了内存空间newsize
newsize=good_num+addnum;
在for循环里对二级指针赋值,提示写入newspace时缓冲区溢出
以为下部分代码
Goods* m = NULL; //定义一级指针
int newsize = goods_num + addnum;
Goods** newspace = new Goods * [newsize]; //定义二级指针并开辟新空间;
if (p_goods != NULL)
{
for (int i = 0; i < goods_num; i++)
newspace[i] = this->p_goods[i];
} //加入原有的数据
for (int i = 0; i < addnum; i++)
{
char name[10];
int price;
int cost;
cout << "输入添加商品名称:";
cin >> name;
cout << "设置价格:";
cin >> price;
cout << "输入成本:";
cin >> cost;
cout << "添加成功!" << endl;
m = new Goods(name,price,cost);//一级指针指向new的对象
newspace[goods_num + i] = m;//一级指针存入二级指针
}
警告:写入newspace时缓冲区溢出
请问如何解决
一级指针也需要开辟空间
Goods** newspace = new Goods * [newsize];
for(int i=0;i<goods_num;i++){
newspace[i]= new Goods[newsize];
newspace[i] = this->p_goods[i];
}
New 和delete要成对使用,你循环每次new,没有delete,可以在每一次循环结束前delete m,看看能不能解决你的问题
二级指针,可以这样理解,一级存元素,二级存一级的地址,都是数组,所以一级二级都需要单独分配内存,释放时先一级后二级
以下代码在vs2019 控制台程序验证过,可行!
int main()
{
int goods_num = 0;
int addnum = 2;
int newsize = goods_num + addnum;
Goods** newspace = (Goods**)malloc(sizeof(Goods*) * newsize);
memset(newspace, 0, sizeof(Goods*) * newsize);
for (int i = 0; i < addnum; i++)
{
char name[10];
int price;
int cost;
cout << "输入添加商品名称:";
cin >> name;
cout << "设置价格:";
cin >> price;
cout << "输入成本:";
cin >> cost;
cout << "添加成功!" << endl;
Goods* m = new Goods(name, price, cost);
newspace[goods_num + i] = m;
}
}
顺便说一句,new Goods * [newsize]; 我没有见过这样用的,如果不是C++新语法的话,我只能认为,你开辟了一个对象,然后把对象指针偏移了newsize 个单位,每个单位是Goods。
望楼主采纳!
如果看不太懂,我可以稍微讲讲