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

C语言中二维数组内存重分配报错求助

问题诊断与修复

你的代码触发内存错误的核心原因是运算符优先级错误,导致realloc分配的内存空间远小于实际需求,引发越界访问。同时存在初始值逻辑错位的问题,以下是具体分析和修复方案:

核心错误点

  • 运算符优先级问题:seg_counter+1 * sizeof(double *)中,乘法*优先级高于加法+,实际计算的是seg_counter + (1 * sizeof(double*)),而非你预期的(seg_counter + 1) * sizeof(double*)。这会导致每次realloc仅分配极小内存,不足以容纳新增的指针,后续访问数组时必然触发内存错误。
  • 初始值逻辑不匹配:你先通过malloc分配了1行内存,但seg_counter初始设为0,导致第一次循环时重复给第0行分配内存,数组扩展逻辑完全错位。

修复后的代码

#include <stdio.h>
#include <stdlib.h>

double** SEG = NULL;

int main ()
{
    int i;
    int seg_counter = 1; // 初始已分配1行,计数器同步为1

    // 初始分配1行内存
    SEG = malloc(seg_counter * sizeof(double *));
    for(i=0; i < seg_counter; i++)
    {
        SEG[i] = malloc(9 * sizeof(double)); // 用数组下标更直观,等价于*(SEG+i)
    }

    while (1)
    {
        // 扩展数组:新增1行,总大小为seg_counter+1个指针
        double** temp = realloc(SEG, (seg_counter + 1) * sizeof(double *));
        if (temp == NULL) {
            // 处理内存分配失败,避免SEG被覆盖为NULL
            fprintf(stderr, "内存分配失败\n");
            exit(EXIT_FAILURE);
        }
        SEG = temp;

        // 为新增行分配内存
        SEG[seg_counter] = malloc(9 * sizeof(double));
        if (SEG[seg_counter] == NULL) {
            fprintf(stderr, "行内存分配失败\n");
            exit(EXIT_FAILURE);
        }

        printf("%d\n", seg_counter);
        seg_counter++;
    }

    // 实际无限循环不会执行到此处,仅作语法规范
    return 0;
}

额外优化建议

  1. 用数组下标替代指针运算:SEG[i]比*(SEG + i)更直观,降低出错概率。
  2. 检查内存分配返回值:malloc和realloc都可能分配失败返回NULL,必须检查并处理,避免程序崩溃。
  3. 规范main函数类型:C标准中main的返回类型应为int,而非void。
  4. 添加循环终止条件:当前是无限循环,实际使用中需添加退出逻辑(如用户输入、达到最大行数等),否则会持续分配内存直至耗尽。

内容的提问来源于stack exchange,提问作者argeus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:35:28