C语言指针操作触发断点报错 代码行(*(exy + i)) = g如何修复
问题根源分析
你写的(*(exy + i)) = g语法本身没有错误,等价于exy[i] = g,触发报错的核心原因是内存越界访问,具体问题点如下:
- 所有用于存储多组数据的指针,要么只指向了单个栈变量的地址,要么只
malloc了1个double的空间,当循环读取数据i>0时,*(exy +i)访问的是超出合法范围的内存,属于典型的缓冲区溢出。 readmoduluskai函数里的time、gcoef、kcoef指针也存在同样的越界问题:仅分配了1个double空间,但循环里每读一行就对指针做自增操作,后续所有偏移访问都是非法的。t、ex、ey、ez、eyz、ezx、exy、ekk这些指针完全没有分配堆空间,直接指向栈上的单个double变量,写入第2个元素时就会破坏栈内存,必然触发运行时异常。
正确修改方案
- 先定义最大读取数据行数,预留足够的存储空间:
// 放在宏定义区域,可根据实际文件行数调整大小 #define MAX_LINE 1024
- 替换main函数里错误的指针定义和内存分配逻辑,不要将指针绑定到栈变量,直接分配对应大小的堆空间:
int main(int argc, char *argv[]) { char filename[20]; char dm[2]; char file[20]; // 统一分配内存 double *time = (double *)malloc(sizeof(double)*MAX_LINE); double *gcoef = (double *)malloc(sizeof(double)*MAX_LINE); double *kcoef = (double *)malloc(sizeof(double)*MAX_LINE); double *ge = (double *)malloc(sizeof(double)); double *ke = (double *)malloc(sizeof(double)); double *t = (double *)malloc(sizeof(double)*MAX_LINE); double *ex = (double *)malloc(sizeof(double)*MAX_LINE); double *ey = (double *)malloc(sizeof(double)*MAX_LINE); double *ez = (double *)malloc(sizeof(double)*MAX_LINE); double *eyz = (double *)malloc(sizeof(double)*MAX_LINE); double *ezx = (double *)malloc(sizeof(double)*MAX_LINE); double *exy = (double *)malloc(sizeof(double)*MAX_LINE); double *ekk = (double *)malloc(sizeof(double)*MAX_LINE); // 增加内存分配成功校验 if (!time || !gcoef || !kcoef || !ge || !ke || !t || !ex || !ey || !ez || !eyz || !ezx || !exy || !ekk) { printf("内存分配失败\n"); return 1; } readmoduluskai(filename, time, gcoef, kcoef, ge, ke, dm); readdata(file, t, ex, ey, ez, eyz, ezx, exy, ekk); // 释放所有分配的内存,补充原来遗漏的释放逻辑 free(time); free(gcoef); free(kcoef); free(ge); free(ke); free(t); free(ex); free(ey); free(ez); free(eyz); free(ezx); free(exy); free(ekk); return 0; }
- 修改
readmoduluskai的循环逻辑,用索引访问避免修改传入的指针本身,同时增加边界判断防止溢出:
while (i < MAX_LINE && 3 == fscanf(fp, "%lg %lg %lg", &time[i], &gcoef[i], &kcoef[i])) { printf("%12lg %12lg %12lg \n", time[i], gcoef[i], kcoef[i]); i++; }
- 修改
readdata的循环逻辑,增加边界判断:
while (i < MAX_LINE && 4 == fscanf(fp, "%lg %lg %lg %lg", &a, &b, &c, &g)) { printf("%12lf %12lf %12lf %12lf \n", a, b, c, g); t[i] = a; ex[i] = b; ey[i] = c; exy[i] = g; i++; }
内容的提问来源于stack exchange,提问作者MonkeySpot
相关产品推荐
相关产品推荐

