QNX系统多线程并行快排文件程序运行异常及编译告警修复咨询
编译告警修复方法
「control reaches end of non-void function」告警的原因非常明确:FileToArray 函数被声明为返回 void* 类型,但函数末尾没有写任何返回语句。pthread 入口函数要求必须返回 void* 类型,你只需要在函数最后一行加一句 return NULL; 即可消除告警。
// FileToArray 函数末尾补充代码 free(a); fclose(f); printf("finish - %s\n", (char*)name); // 顺便把%p改成%s方便确认文件名 return NULL; // 新增这行 }
程序运行无效果的原因排查
按问题出现概率从高到低排列:
- 未传入运行参数:程序逻辑要求必须将待处理的文件名作为运行参数传入,如果你直接执行二进制文件没有传任何文件名,
argc=1,两个for循环都不会执行,自然没有任何操作。哪怕只传1个文件也可以触发处理,不需要多个文件,示例运行命令:./你的程序名 1.txt 2.txt - 线程ID数组越界崩溃:你分配
thread_ids数组的大小是CPU核心数num_cpus,但创建线程的数量是传入的文件数量argc-1,只要文件数>CPU核心数,就会发生数组越界,直接触发内存访问错误导致程序崩溃,文件自然不会被修改。修复方法:按文件数量分配线程ID数组大小:// main函数里修改分配逻辑,没用的num_cpus、num_lines_per_cpu变量可以直接删除 thread_ids = malloc(sizeof(pthread_t) * (argc-1)); - 文件打开失败未处理:你没有判断
fopen的返回值,如果传入的文件名不存在、路径错误、没有读写权限,fopen会返回NULL,后续执行feof(f)就会访问空指针直接崩溃。建议添加判断逻辑:FILE *f = fopen(name, "r"); if (f == NULL) { perror("打开文件失败"); return NULL; } - 内存分配逻辑错误:
realloc的大小计算错误,你写的sizeof(int)*i+1实际是i个int的大小加1字节,完全不足以存储新的int元素,会触发堆内存越界,直接导致程序崩溃。修改为:a = realloc(a, sizeof(int) * (i + 1)); - feof使用逻辑错误:
feof是在读取操作失败后才会被置位,你先判断feof再读取,会导致最后一次读取失败时仍然计数+1,甚至当文件只有1个元素时,i-2为负数,传给快速排序会触发数组越界崩溃。修改读取逻辑:int num; while (fscanf(f, "%d", &num) == 1) { a[i] = num; i++; a = realloc(a, sizeof(int) * (i + 1)); } // 后续排序、写入的边界也要对应修改 quickSort(a, 0, i-1); f=fopen(name,"w"); for (j=0;j<i;j++){ fprintf(f, "%d\n",a[j]); }
内容的提问来源于stack exchange,提问作者user17059077
相关产品推荐
相关产品推荐

