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

C语言写入3个及以上数组元素时触发总线错误问题排查

总线错误根源排查

你的代码出现总线错误的核心问题在data_io.c的input函数中,具体是scanf的参数传递错误:

// 错误代码
if (scanf("%lf", data[i]) != 1)
    return 0;

错误原因

data是double **类型(二级指针),data[i]等价于*(data + i),这会尝试访问二级指针指向的第i个指针位置,但你只通过*data = malloc(...)分配了一个一级指针(指向double数组的首地址),并没有为二级指针本身分配更多指针空间。当i≥1时,data[i]访问的是未初始化/未分配的内存区域,直接触发总线错误。

修正方案

需要传递malloc分配的数组中第i个元素的地址,正确写法有两种:

  1. 使用数组下标语法:&(*data)[i]
  2. 使用指针偏移:(*data) + i

同时建议检查malloc是否成功,避免内存分配失败导致后续操作出错。修正后的input函数如下:

int input(double **data, int *n) {
    if (scanf("%d", n) == 1 && *n > 0) {
        printf("n is int\n");
        printf("n = %d\n", *n);
        *data = malloc((*n) * sizeof(double));
        // 检查malloc是否成功
        if (*data == NULL) {
            return 0;
        }
        for (int i = 0; i < *n; i++) {
            // 修正scanf的参数
            if (scanf("%lf", &(*data)[i]) != 1) {
                // 输入失败时释放已分配内存,避免泄漏
                free(*data);
                *data = NULL;
                return 0;
            }
        }
        return 1;
    } else {
        return 0;
    }
}

额外优化点

  • 输入数组长度时增加*n > 0判断,避免分配0长度的无效数组
  • 输入元素失败时释放已分配内存,防止内存泄漏

内容的提问来源于stack exchange,提问作者Re.translator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:50:21