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; }
额外优化建议
- 用数组下标替代指针运算:
SEG[i]比*(SEG + i)更直观,降低出错概率。 - 检查内存分配返回值:
malloc和realloc都可能分配失败返回NULL,必须检查并处理,避免程序崩溃。 - 规范main函数类型:C标准中
main的返回类型应为int,而非void。 - 添加循环终止条件:当前是无限循环,实际使用中需添加退出逻辑(如用户输入、达到最大行数等),否则会持续分配内存直至耗尽。
内容的提问来源于stack exchange,提问作者argeus
相关产品推荐
相关产品推荐

