为何我创建线程的C程序触发Segmentation Fault错误?
问题分析与修复方案
核心错误原因
你遇到的Segmentation Fault(段错误)根源在于线程传参方式错误:
- 在
pthread_create中,你直接把int类型的maxNumber(值为20)强制转换为void*指针传递给线程函数 - 但线程函数里却把这个指针当成
int*去解引用(*maxNumber),这相当于试图访问内存地址0x14(20的十六进制),这属于非法内存访问,直接触发段错误
另外还有两个次要问题:
- main线程创建子线程后立刻
return 0,会直接终止整个进程,子线程大概率还没执行就被强制结束 printEvenNumbers里的printf拼写错误:Evem应该是Even,且所有printf都没有换行符,输出会混乱
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> void* printOddNumbers(void* maxNumbers); void* printEvenNumbers(void* maxNumbers); int main(){ pthread_t oddNumbersThread; pthread_t evenNumbersThread; int maxNumber = 20; // 传递变量的地址,而不是直接转值为指针 pthread_create(&oddNumbersThread, NULL, printOddNumbers, &maxNumber); pthread_create(&evenNumbersThread, NULL, printEvenNumbers, &maxNumber); // 等待两个子线程执行完毕再退出main线程 pthread_join(oddNumbersThread, NULL); pthread_join(evenNumbersThread, NULL); printf("Main thread finished\n"); return 0; } void* printOddNumbers(void* maxNumbers){ int maxNumber = *(int *)maxNumbers; int currentNumber = 1; while(currentNumber <= maxNumber){ sleep(1); printf("Odd: %d\n", currentNumber); // 添加换行符 currentNumber += 2; } return NULL; // 线程函数需要返回void*类型值 } void* printEvenNumbers(void* maxNumbers){ int maxNumber = *(int *)maxNumbers; int currentNumber = 0; while(currentNumber <= maxNumber){ sleep(1); printf("Even: %d\n", currentNumber); // 修正拼写错误+换行 currentNumber += 2; } return NULL; }
关键修复点说明
- 线程传参:传递
&maxNumber(变量的内存地址),线程函数中解引用这个地址获取正确的数值,避免非法内存访问 - 线程同步:使用
pthread_join等待子线程执行完成,确保子线程能正常运行完毕 - 输出修正:修复拼写错误并添加换行符,让输出更清晰
- 返回值:线程函数必须返回
void*类型值,添加return NULL符合规范
内容的提问来源于stack exchange,提问作者Avi C
相关产品推荐
相关产品推荐

