如何通过void指针访问并修改C语言结构体成员?
解决void指针访问结构体成员的问题
错误原因
你的代码存在两个核心问题:
- 运算符优先级错误:
.的优先级高于类型转换,(cat)pointer.test会先尝试访问pointer的test成员,但pointer是void*类型,本身没有结构体成员,直接触发编译错误。 - 类型转换错误:需要把
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
相关产品推荐
相关产品推荐

