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

如何通过void指针访问并修改C语言结构体成员?

解决void指针访问结构体成员的问题

错误原因

你的代码存在两个核心问题:

  1. 运算符优先级错误:. 的优先级高于类型转换,(cat)pointer.test 会先尝试访问 pointer 的 test 成员,但 pointer 是 void* 类型,本身没有结构体成员,直接触发编译错误。
  2. 类型转换错误:需要把 void* 转换成结构体指针类型(cat*),而不是结构体类型(cat)。

正确写法

有两种可行的修改方式:

方式一:使用指针访问运算符 ->

先将 void* 强制转换为 cat*,再用 -> 访问结构体成员:

#include <stdio.h>
typedef struct _cat{
    int test;
}cat;

int main()
{
cat fcat;
fcat.test=200;
void * pointer=NULL;
pointer=&fcat;
((cat*)pointer)->test = 300; // 正确写法
printf("fcat.test = %d\n", fcat.test); // 输出300
}

方式二:先解引用结构体指针,再用 . 访问成员

先转换为 cat*,解引用后得到结构体实例,再用 . 访问成员:

#include <stdio.h>
typedef struct _cat{
    int test;
}cat;

int main()
{
cat fcat;
fcat.test=200;
void * pointer=NULL;
pointer=&fcat;
(*(cat*)pointer).test = 300; // 正确写法
printf("fcat.test = %d\n", fcat.test); // 输出300
}

关键说明

  • void* 本身没有类型信息,编译器无法识别其指向的内存结构,必须先转换为对应的结构体指针类型才能访问成员。
  • 必须用括号包裹 (cat*)pointer,确保类型转换先于成员访问运算符执行,避免优先级导致的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:46:01