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

为何我创建线程的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:05:32