C++中结构体动态数组无法填充内部double动态数组问题
C++结构体动态数组输入顶点坐标时崩溃问题排查
我英文不太好,在C++中创建了结构体的动态数组,结构体内部包含double类型的动态数组。添加结构体时,边数和边长可正常输入,但输入顶点坐标(需以此恢复其余顶点)时程序崩溃。尝试将动态double数组改为静态数组,问题仍未解决。相关代码如下:
struct regular_polygon { int count_sides; double length; double square; double perimeter; double *x = new double[count_sides]; double *y = new double[count_sides]; }; void SetData(regular_polygon* reg_pol, int amount, int* output) { cout << "Enter count of sides:" << '\n'; cin >> reg_pol[amount-1].count_sides; bool flag = false; if (reg_pol[amount].count_sides > 2) flag = true; while (flag == false) { cout << "Incorrect! Sides must be more than 2. Try again" << '\n'; cin >> reg_pol[amount].count_sides; if (reg_pol[amount].count_sides > 2) flag = true; } cout << "Enter length of the side:" << '\n'; cin >> reg_pol[amount].length; flag = false; if (reg_pol[amount].length > 0) flag = true; while (flag == false) { cout << "Incorrect! Length must be more than 0. Try again" << '\n'; cin >> reg_pol[amount].count_sides; if (reg_pol[amount].length > 0) flag = true; } cout << "Enter vertex coordinates" << '\n'; cout << "Enter x:" << '\n'; cin >> reg_pol[amount - 1].x[0]; /// 此处出错 cout << "Enter y:" << endl; cin >> reg_pol[amount - 1].y[0]; coordinates(reg_pol, amount); } // 重复的代码片段(疑似粘贴错误) // cout << "Enter vertex coordinates" << '\n'; // cout << "Enter x:" << '\n'; // cin >> reg_pol[amount - 1].x[0]; /// There is an error
问题根源及修正方案
1. 结构体动态数组初始化错误
结构体中double *x = new double[count_sides];的初始化逻辑完全错误:此时count_sides是未初始化的成员变量,值为随机垃圾值,用它作为数组大小分配内存会得到无效的内存空间,后续访问必然触发崩溃。
修正:删除结构体中动态数组的默认初始化,改为在确定count_sides的值后手动分配内存:
struct regular_polygon { int count_sides; double length; double square; double perimeter; double *x = nullptr; // 初始化为空指针 double *y = nullptr; }; // 在SetData函数中,输入count_sides后立即分配数组 cin >> reg_pol[amount-1].count_sides; // 先检查是否已分配,避免内存泄漏(如果是修改已有元素的话) if (reg_pol[amount-1].x != nullptr) delete[] reg_pol[amount-1].x; if (reg_pol[amount-1].y != nullptr) delete[] reg_pol[amount-1].y; reg_pol[amount-1].x = new double[reg_pol[amount-1].count_sides]; reg_pol[amount-1].y = new double[reg_pol[amount-1].count_sides];
2. 数组索引越界
函数中多处错误使用reg_pol[amount],而实际要操作的是第amount个元素(索引应为amount-1),reg_pol[amount]超出了数组的有效范围,会破坏内存布局,导致后续操作崩溃。
修正:将所有reg_pol[amount]替换为reg_pol[amount-1],比如:
bool flag = false; if (reg_pol[amount-1].count_sides > 2) flag = true; while (flag == false) { cout << "错误!边数必须大于2,请重新输入" << '\n'; cin >> reg_pol[amount-1].count_sides; if (reg_pol[amount-1].count_sides > 2) flag = true; }
3. 边长输入的逻辑错误
在边长输入的循环中,错误地将输入值写入count_sides变量:cin >> reg_pol[amount].count_sides;,导致边长始终未被正确赋值,同时覆盖了之前输入的边数。
修正:改为写入length变量:
while (flag == false) { cout << "错误!边长必须大于0,请重新输入" << '\n'; cin >> reg_pol[amount-1].length; // 修正为length if (reg_pol[amount-1].length > 0) flag = true; }
额外建议
- 优先使用
std::vector<double>替代手动管理的动态数组,避免内存泄漏和越界问题,代码更简洁安全:struct regular_polygon { int count_sides; double length; double square; double perimeter; std::vector<double> x; std::vector<double> y; }; // 分配时直接resize即可 reg_pol[amount-1].x.resize(reg_pol[amount-1].count_sides); reg_pol[amount-1].y.resize(reg_pol[amount-1].count_sides); - 若坚持手动管理动态内存,记得在结构体销毁时释放分配的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Vladimir_gr
相关产品推荐
相关产品推荐

