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

pthread中解引用结构体指针修改内部值编译报错如何解决

错误原因汇总
  • 结构体t_data定义在main函数内部,作用域仅覆盖main函数,deal_cards函数无法识别该类型,直接在deal_cards中写struct t_data*会触发类型未定义的编译错误。
  • deal_cards内的类型转换和成员访问语法完全不符合C++规范,不能直接对类型名使用->操作符,需要先将void*参数转换为具体的结构体指针变量,再按规则访问成员。
  • 编译参数书写错误,pthread库的链接参数是-lpthread,你写的-lpthreads多了一个字母s,会导致链接阶段失败。
  • 缺少线程等待逻辑,主线程创建子线程后没有调用pthread_join,主线程执行完直接退出会导致整个进程终止,子线程没有机会执行修改操作。
  • 缺少头文件依赖,代码中使用了std::string但没有引入<string>头文件,部分编译器会触发未定义类型错误。
修复后的正确代码
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string>
#include <pthread.h>

// 结构体移至全局作用域,保证两个函数都能访问该类型定义
struct t_data {
    std::string name;
    std::string status;
    std::vector<int> hand;
    std::vector<int> *ptr_deck;
};

void *deal_cards(void* data);

int main() {
    std::vector<int> deck = {1,2,3};
    std::vector<int> *p_deck = &deck;
    t_data player1_data = {"PLAYER 1", "lose", {}, p_deck};
    t_data *player1 = &player1_data;
    pthread_t p1;
    pthread_create(&p1, NULL, deal_cards, (void *)player1);
    // 等待子线程执行完成
    pthread_join(p1, NULL);
    // 测试输出验证deck修改结果
    for (int num : deck) {
        printf("%d ", num);
    }
    return 0;
}

void* deal_cards(void* data) {
    // 先将void*转换为t_data类型的指针
    t_data *p = (t_data*)data;
    // ptr_deck本身是vector<int>的指针,用->调用push_back方法
    p->ptr_deck->push_back(3);
    return NULL;
}

编译命令修改为:
g++ main.cpp -o main -lpthread

修改逻辑的合法性说明

你通过传递结构体指针到线程函数修改内部成员的逻辑本身是合法的,只要修复上述错误就能正常运行。需要注意如果有多个线程同时读写同一份deck数据,必须额外加互斥锁(pthread_mutex_t)避免数据竞争问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:06:03