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

Bus error: 10含义解析及修复方法(附C语言报错代码)

Bus error: 10 含义及修复方案

一、Bus error: 10 是什么?

Bus error(总线错误)本质是程序尝试访问不属于自身进程的非法内存地址,或是访问内存的方式违反硬件规则(比如内存对齐错误)。在你的代码场景中,核心原因是使用了未初始化的指针,导致写入了无权限的内存区域。

二、你的代码问题分析

看get_string函数里的这段代码:

char* input;
scanf("%s", input);

这里的input是未初始化的指针,它的指向是随机的垃圾地址。scanf尝试把用户输入的字符串写入这个随机地址,而该地址几乎不可能属于你的进程可访问内存,直接触发了总线错误。

三、修复方案

有三种常用的修复方式,按需选择:

方式1:栈上固定大小数组(适合输入长度可控场景)

在栈上分配一块足够大的内存存储输入,简单直接:

#include <stdio.h>
#include <string.h>

#define MAX_INPUT_LEN 256  // 定义最大允许输入长度

char* get_string(char* question, char* buffer, int max_len);

int main(void)
{
    char name[MAX_INPUT_LEN];
    get_string("Enter a name:", name, MAX_INPUT_LEN);
    printf("%s\n", name);
    return 0;
}

char* get_string(char* question, char* buffer, int max_len)
{
    printf("%s", question);
    // 限制输入长度,避免缓冲区溢出
    scanf("%255s", buffer);
    return buffer;
}

方式2:动态内存分配(适合输入长度不确定场景)

用malloc动态分配内存,注意使用完后要释放避免内存泄漏:

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

char* get_string(char* question);

int main(void)
{
    char* name = get_string("Enter a name:");
    if (name != NULL) {
        printf("%s\n", name);
        free(name);  // 释放动态分配的内存
    }
    return 0;
}

char* get_string(char* question)
{
    printf("%s", question);
    // 初始分配128字节内存,可根据需求调整
    char* input = malloc(128);
    if (input == NULL) {
        perror("malloc failed");
        return NULL;
    }
    scanf("%s", input);
    return input;
}

方式3:使用getline处理任意长度输入(最安全)

getline会自动调整内存大小,适配任意长度的用户输入:

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

char* get_string(char* question);

int main(void)
{
    char* name = get_string("Enter a name:");
    if (name != NULL) {
        printf("%s", name);  // getline会保留输入的换行符,无需额外加\n
        free(name);
    }
    return 0;
}

char* get_string(char* question)
{
    printf("%s", question);
    char* input = NULL;
    size_t buffer_len = 0;
    ssize_t read_len = getline(&input, &buffer_len, stdin);
    
    if (read_len == -1) {
        perror("getline failed");
        free(input);  // 即使读取失败,也要释放已分配的内存
        return NULL;
    }
    return input;
}

内容的提问来源于stack exchange,提问作者Samuel Cai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:48:57