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

C语言中使用指针更新数组出现Bus Error:10问题求助

解决Bus Error:10并让外部正确获取grades数组的值

看起来你遇到的核心问题是指针使用不当导致的内存访问错误,同时函数内部计算出的成绩数据无法正确传递到外部。先帮你拆解问题本质,再给出具体的解决方案:

为什么会出现Bus Error:10?

Bus Error:10在C语言里最常见的诱因之一,就是你试图访问已经被系统回收的无效内存——比如你的函数里可能定义了一个局部数组,然后把这个数组的地址返回给了外部。局部变量存储在函数的栈帧中,当函数执行完毕返回时,栈帧会被销毁,对应的内存空间会被系统收回。这时候外部拿着这个地址去访问,本质上是在操作不存在的内存,自然就触发了Bus Error。

举个你大概率踩中的错误示例:

// 错误示例:返回局部数组的地址
int* get_grades() {
    int local_grades[10];
    // 这里计算成绩,能得到正确的0/1值
    for(int i=0; i<10; i++){
        local_grades[i] = (i%2);
    }
    return local_grades; // 大错特错!函数返回后local_grades就被销毁了
}

如何让外部正确获取grades的实际值?

要解决这个问题,核心是确保外部访问的内存是有效且持久的,有两种常用的正确做法:

方法1:让调用者提前分配好内存,函数负责填充数据

这种方式最安全,也不需要担心内存泄漏。让main函数(或者调用方)提前创建好数组,把数组的指针传递给函数,函数内部直接往这个指针指向的内存里写入成绩:

#include <stdio.h>

// 函数接收成绩数组指针和数组长度,直接填充数据
void calculate_grades(int* grades, int num_students) {
    // 这里替换成你的实际成绩计算逻辑
    for(int i=0; i<num_students; i++){
        // 示例:生成0或1的成绩
        grades[i] = (i % 2 == 0) ? 1 : 0;
    }
}

int main() {
    int num_students = 5;
    int grades[num_students]; // 调用者提前分配数组内存

    // 调用函数填充成绩
    calculate_grades(grades, num_students);

    // 现在可以正常循环访问grades[i]了
    for(int i=0; i<num_students; i++){
        printf("Student %d grade: %d\n", i+1, grades[i]);
    }

    return 0;
}

方法2:函数内部动态分配内存,返回指针给外部

如果数组的长度需要在函数内部确定,或者调用者不方便提前分配,可以用malloc动态分配内存,然后把指针返回给外部。但要注意外部必须记得用free释放内存,避免内存泄漏:

#include <stdio.h>
#include <stdlib.h>

// 函数动态分配内存并返回成绩数组指针
int* calculate_grades(int num_students) {
    // 分配内存,记得检查是否分配成功
    int* grades = malloc(num_students * sizeof(int));
    if(grades == NULL){
        printf("Memory allocation failed!\n");
        return NULL;
    }

    // 计算成绩并填充
    for(int i=0; i<num_students; i++){
        grades[i] = (i % 2 == 0) ? 1 : 0;
    }

    return grades;
}

int main() {
    int num_students = 5;
    int* grades = calculate_grades(num_students);

    // 先检查指针是否有效
    if(grades != NULL){
        // 循环访问成绩
        for(int i=0; i<num_students; i++){
            printf("Student %d grade: %d\n", i+1, grades[i]);
        }
        // 必须释放动态分配的内存
        free(grades);
    }

    return 0;
}

关键注意点

  • 绝对不要返回局部变量的地址,不管是数组还是单个变量,函数返回后局部变量的内存都会被回收。
  • 用动态内存分配时,一定要检查malloc的返回值,避免空指针访问;同时外部必须负责释放内存。
  • Bus Error:10也可能是数组越界访问导致的,比如你循环访问grades[i]时,i超过了数组的实际长度,这种情况也要检查你的循环边界是否正确。

内容的提问来源于stack exchange,提问作者A.Gharbi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:43:30