使用-lpthread编译的C多线程排序程序Mac运行正常Linux报段错误
问题定位与修复方案
核心错误点
- 局部变量未初始化:
main函数中定义的count、totalnum、j没有赋初始值,Mac系统栈内存默认会清零,而Linux系统栈内存是随机值,导致count变量直接随机偏移,访问fullnum数组越界,这是跨平台段错误的核心原因。 - 输入解析逻辑错误:
fullnum[count][j] = '\0' || NULL;写法完全错误,逻辑或运算返回的是布尔值1,不会给字符串加正确的结束符;且最后一个数字后没有逗号,会被解析逻辑漏掉,totalnum计数少1。 - 线程逻辑完全错误:你自定义的
pointer结构体完全没有被使用,两个sorter线程执行的是完全相同的逻辑,同时对全局数组num1的前后两段排序,存在严重的数据竞争,完全没有发挥多线程的作用。 - 缺少文件打开判空逻辑:如果
IntegerList.txt不存在或路径错误,fopen返回空指针,后续fgets直接访问空指针触发段错误。 - 重复冗余代码:存在两次循环给
num1数组赋值的冗余逻辑,无意义且增加出错概率。
修复步骤
- 初始化所有局部变量:将
main函数中变量定义修改为int i, j = 0, count = 0, totalnum = 0; - 修正输入解析逻辑:
- 将错误的赋值行改为
fullnum[count][j] = '\0'; - 输入遍历循环结束后,手动处理最后一个数字:
fullnum[count][j] = '\0'; totalnum++; - 将错误的赋值行改为
- 修正线程逻辑,使用传入的区间参数:
- 创建线程前给
pointer结构体赋值:
tparam1->starting_index = 0; tparam1->ending_index = midarraysize; tparam2->starting_index = midarraysize + 1; tparam2->ending_index = arraysize - 1;- 修改
sorter函数,读取传入的参数排序对应区间:
void *sorter(void *params){ pointer *p = (pointer *)params; sort(num1, p->starting_index, p->ending_index); pthread_exit(0); } - 创建线程前给
- 增加文件判空逻辑,打开文件后先判断是否为空:
if (IntList == NULL) { printf("打开IntegerList.txt失败\n"); return 1; } - 删掉重复给
num1数组赋值的冗余循环。
运行验证
重新使用gcc Test2.c -o Test2 -lpthread编译即可在Linux环境正常运行,不会出现段错误,排序逻辑也符合预期。
内容的提问来源于stack exchange,提问作者Bennie
相关产品推荐
相关产品推荐

