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

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个元素时就会破坏栈内存,必然触发运行时异常。
正确修改方案
  1. 先定义最大读取数据行数,预留足够的存储空间:
// 放在宏定义区域,可根据实际文件行数调整大小
#define MAX_LINE 1024
  1. 替换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;
}
  1. 修改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++;
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:06:04