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

Linux下运行C++多线程程序出现Segmentation Fault问题求助

问题分析与修复方案

核心错误:未初始化指针触发段错误

子线程函数avg中,以下代码是引发Segmentation Fault的直接原因:

float *avg1;
*avg1=sum/size;

avg1是未初始化的野指针,指向内存中随机地址,直接解引用赋值属于非法内存访问,必然触发段错误。

其他潜在问题

  • 参数名混淆:main函数参数写反,标准签名应为int argc, char** argv,当前写法易造成逻辑混淆。
  • 非标准变长数组:int arr[n]是C语言特性,C++标准未支持,不同编译器兼容性差异会导致代码在不同机器上表现不一致。
  • 线程返回值内存风险:若返回栈上变量的指针,线程退出后栈内存会被回收,主线程访问时会出现未定义行为。

修复后的代码

#include<iostream>
#include<pthread.h>
#include<cstdlib>
using namespace std;

void *avg(void* ar )
{
    int *p = static_cast<int*>(ar);
    int size = *p;
    size--;
    float sum = 0;
    for(int i = 0; i < size; i++)
    {
        p++;
        sum += *p;
    }

    // 堆内存存储平均值,避免栈内存回收问题
    float *avg_val = new float(sum / size);
    pthread_exit(static_cast<void*>(avg_val));
}

int main(int argc, char** argv )
{
    // 处理无输入的边界情况
    if(argc < 2)
    {
        cout << "请输入至少一个数字" << endl;
        return EXIT_FAILURE;
    }

    // 动态分配数组,保证C++标准兼容性
    int *arr = new int[argc];
    arr[0] = argc;
    for(int i = 1; i < argc; i++)
    {
        arr[i] = atoi(argv[i]);
    }

    pthread_t t1;
    int x = pthread_create(&t1, NULL, &avg, static_cast<void*>(arr));
    if(x != 0)
    {
        cout << "创建线程失败" << endl;
        delete[] arr;
        exit(EXIT_FAILURE);
    }

    float *rt1;
    pthread_join(t1, reinterpret_cast<void**>(&rt1));
    cout << "AVG:" << *rt1 << endl;

    // 释放堆内存,避免内存泄漏
    delete rt1;
    delete[] arr;
    return 0;
}

修复要点说明

  • 初始化指针:改用new在堆上分配内存存储平均值,线程退出后内存依然有效,主线程可安全访问。
  • 修正main参数:使用标准的argc(参数个数)和argv(参数数组)命名,符合C++规范。
  • 替换变长数组:用动态分配数组替代非标准变长数组,保证跨编译器兼容性。
  • 内存泄漏修复:添加堆内存释放操作,避免内存泄漏。
  • 类型转换优化:使用C++风格的static_cast和reinterpret_cast替代C风格强制转换,提升类型安全性。

内容的提问来源于stack exchange,提问作者BinaryBrain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:26:25