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
相关产品推荐
相关产品推荐

