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个元素的地址,正确写法有两种:
- 使用数组下标语法:
&(*data)[i] - 使用指针偏移:
(*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
相关产品推荐
相关产品推荐

