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

