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

使用GCC编译冒泡排序程序出现Segmentation Fault错误,求定位

排查你的冒泡排序程序段错误问题

我来帮你一步步拆解这段代码里的问题,你的segmentation fault(段错误)主要是由几个关键错误导致的,还有一些潜在bug也需要修正:

1. 指针v未分配内存(核心段错误原因)

你声明了int *v;但完全没给它分配内存空间——v此时是个「野指针」,指向的是随机的、无权访问的内存地址。当你执行fscanf(fp, "%d", &v[i]);往这个指针指向的区域写数据时,直接触发了内存访问违规,这就是段错误的根源。

你得先确定要读取的整数数量,再给v分配对应大小的内存,或者用动态扩容的方式(比如realloc)来适配文件里的内容。

2. 变量n未初始化

你在冒泡排序的循环里用到了n:for(i=1; i<n; i++)和j< n-i-1,但n从始至终都没被赋值过,它的值是内存里的随机垃圾值。这会导致循环次数完全不可控,进一步加剧内存访问的混乱。

3. 文件类型拼写错误

C标准库中文件指针的类型是大写的FILE,你写的File *fp;是错误的——这会导致编译错误,如果你能运行起来,大概率是忽略了编译警告,这会让后续的文件操作行为异常。

4. feof的典型错误用法

while(!feof(fp))是很多新手会踩的坑:feof只有在尝试读取超出文件末尾之后才会返回真,这会导致你最后一次循环时读取到无效数据,甚至触发额外的越界操作。正确的做法是把fscanf的返回值作为循环条件,判断是否成功读取到了一个整数。

5. 其他潜在风险

  • 文件打开失败后,你只打印了错误信息但没有终止程序,后续代码还会继续对NULL指针fp进行操作,这非常危险;
  • 程序结束前没有关闭文件fclose(fp);,会造成系统资源泄漏;
  • 冒泡排序的外层循环起始值i=1是错误的,应该从i=0开始,或者调整循环条件为i < n-1,否则会少排一次。

修正后的完整代码

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

int main() {
    int *v = NULL;
    int i = 0, n = 0, j = 0, aux = 0;
    FILE *fp;
    int temp;

    // 打开文件,失败则直接退出
    fp = fopen("Inteiros.txt", "r");
    if(fp == NULL) {
        printf("Erro, ficheiro nao encontrado!\n");
        return 1;
    }

    // 第一步:先统计文件里的整数总数,确定n的值
    while(fscanf(fp, "%d", &temp) == 1) {
        n++;
    }
    // 把文件指针重置回文件开头,准备读取数据
    rewind(fp);

    // 分配对应大小的内存,检查分配是否成功
    v = (int*)malloc(n * sizeof(int));
    if(v == NULL) {
        printf("Erro ao alocar memoria!\n");
        fclose(fp);
        return 1;
    }

    // 第二步:读取文件中的整数到数组
    i = 0;
    while(fscanf(fp, "%d", &v[i]) == 1) {
        i++;
    }

    // 冒泡排序(修正了循环条件)
    for(i = 0; i < n-1; i++) {
        for(j = 0; j < n - i - 1; j++) {
            if(v[j] > v[j+1]) {
                aux = v[j];
                v[j] = v[j+1];
                v[j+1] = aux;
            }
        }
    }

    // 可选:打印排序后的结果
    // printf("Ordenado: ");
    // for(i=0; i<n; i++) {
    //     printf("%d ", v[i]);
    // }
    // printf("\n");

    // 释放资源,避免泄漏
    free(v);
    fclose(fp);
    return 0;
}

这个版本解决了所有问题:先统计文件里的整数数量再分配内存,正确处理文件读取逻辑,修复了feof的错误用法,同时添加了资源释放的步骤,避免内存和文件句柄泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:04:57