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

如何将void*强制转换为结构体/联合体类型以访问其成员字段?

问题原因

NODE结构体中的dataPtr是void *无类型指针,C语言语法不支持直接对无类型指针执行结构体成员访问操作,必须先将其转换为实际存储的PRINTJOB类型指针后,才能访问对应字段。
你原来的写法存在执行优先级错误:temp->dataPtr->docNum会先尝试对void*类型的dataPtr访问docNum成员,直接触发了Member reference base type 'void' is not a structure or union报错,后续的类型转换逻辑不会生效。

正确访问方式

你可以选择两种写法实现字段访问:

写法1:先做类型转换赋值给临时变量(可读性更高)

for (NODE *temp = sList->head; temp!=NULL;temp=temp->next){
    // 将无类型指针转换为PRINTJOB类型指针
    PRINTJOB *currentJob = (PRINTJOB*) temp->dataPtr;
    // 直接访问PRINTJOB的成员即可
    printf("DocNo: %d \n", currentJob->docNum);
    // 其他字段访问示例:
    // printf("请求优先级:%d \n", currentJob->requestPri);
    // printf("页数:%d \n", currentJob->pageNums);
}

写法2:单一行内完成转换与访问

需要注意括号匹配,保证类型转换逻辑先执行:

for (NODE *temp = sList->head; temp!=NULL;temp=temp->next){
    printf("DocNo: %d \n", ((PRINTJOB*)temp->dataPtr)->docNum);
}
注意事项
  • 必须保证存入链表的dataPtr确实指向PRINTJOB类型的有效内存,否则强制转换后访问会触发未定义行为
  • 不要对docNum做多余的*(int)强制解引用,docNum本身就是int类型,无需额外解引用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:06:10