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

C语言实现BogoSort时出现Segmentation Fault错误求助

BogoSort 段错误问题分析与修复

核心错误:数组下标越界

你的代码触发Segmentation Fault的直接原因是sortNew()函数里的随机下标生成逻辑错误:

int ran = rand();

rand()返回的随机数范围是0到RAND_MAX(通常为32767),而你的数组bogo长度仅为7,合法下标是0-6。当ran值大于等于7时,访问bogo[ran]会直接越界访问数组外的内存,触发内存访问错误。

额外问题:重复初始化随机种子

每次调用sortNew()都执行srand(time(NULL))会导致随机数序列重复——因为time(NULL)的精度是秒级,短时间内多次调用会生成相同的随机种子,导致排序时的随机交换完全重复,排序效率极低,甚至可能永远无法得到有序数组。

修复后的完整代码

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

int tries = 0;

int bogo[7];
int length = sizeof(bogo) / sizeof(bogo[0]);

void setBogo();
void printBogo();
bool bogoFinished();
void sortNew();

int main() {
    srand(time(NULL)); // 仅在程序启动时初始化一次随机种子
    setBogo();
    
    while (!bogoFinished()) 
        sortNew();
        
    printBogo();
    printf("Versuche benötigt: %d", tries);

    return 0;
}

void setBogo() {
    for (int i = 0; i < length; i++)
        bogo[i] = rand() % 100;
}

void printBogo() {
    for (int i = 0; i < length; i++)
        printf("Pos.: %d, Value: %d\n", i, bogo[i]);
}

bool bogoFinished() {
    int letzte = 0;
    
    for (int i = 1; i < length; i++)
        if (bogo[i] < bogo[letzte])
            return false;
        else letzte = i;
        
    return true;
}

void sortNew() {
    tries++;
    
    for (int i = 0; i < length; i++) {
        int value = bogo[i];
        int ran = rand() % length; // 限制随机下标在数组合法范围内
        
        bogo[i] = bogo[ran];
        bogo[ran] = value;
    }
}

补充说明

  • 数组越界是C语言中常见的未定义行为,编译器不会主动检查,运行时会直接触发内存访问错误,写代码时务必确保下标在合法范围内。
  • BogoSort是效率极低的“猴子排序”,仅适合算法原理学习,实际开发中完全不会使用——数组长度超过5时,成功排序的概率就已经低到几乎无法在合理时间内完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:33:25