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

Ubuntu下C程序输入超5句触发Bus error (core dumped)求助

解决你的C程序Bus Error(Core Dumped)问题

从你描述的「输入句子数量超过5就触发崩溃」的现象来看,内存越界访问大概率是罪魁祸首,正好也对应你怀疑的内存分配相关问题。下面给你几个针对性的排查和修复方向:

1. 先检查存储容器的大小是否达标

如果你是用固定数组来存句子的指针或者内容,比如不小心写成了char *sentences[5];而不是char *sentences[10];,那当输入第6句时,程序就会往数组边界外的内存写数据,直接触发Bus error。

  • 先核对你定义的存储句子的数组/容器大小,确保它能容纳最多10个元素。

2. 排查动态内存分配的问题

如果用malloc给每句分配内存,要注意两个关键:

  • 有没有检查malloc的返回值?如果内存分配失败,malloc会返回NULL,后续对NULL指针的写入操作肯定会崩溃。
  • 分配的内存空间是否足够?要是你固定分配了一个过小的尺寸(比如只给50字节),用户输入长句子时就会越界写入,触发错误。
    给你个简单的检查示例:
    #define MAX_LINE_LEN 256
    char *current_sentence = malloc(MAX_LINE_LEN);
    if (current_sentence == NULL) {
        perror("Failed to allocate memory");
        exit(EXIT_FAILURE);
    }
    

3. 处理scanf和fgets混用的遗留问题

你提到知道这俩函数的不足但按要求使用,这里要注意:scanf读取完句子数量后,输入缓冲区里会留下一个换行符,后续的fgets会直接把这个换行符当成空行读取,可能导致程序逻辑混乱,间接引发内存操作异常。可以在scanf之后加一行代码清空缓冲区:

int num_sentences;
scanf("%d", &num_sentences);
// 清除缓冲区里的残留换行符
while (getchar() != '\n');

4. 警惕栈溢出的可能

如果你的句子缓冲区是定义在栈上的大数组(比如char line_buffer[1024];),当同时存储多个长句子时,有限的栈空间可能不够用,进而触发Bus error。这种情况可以换成用malloc在堆上分配内存,堆的空间比栈大得多。

优先排查第一个方向——存储容器的大小,毕竟「超过5就崩溃」这个现象太符合数组大小设成5的情况了,大概率是这个低级错误导致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:14:06