You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:23:19