结构体指针转字符指针后能否访问结构体字段?
问题解答
首先,你的代码存在初始化错误:struct student *s_stud ={{13,"jacob"},{12,"lia"}} 是非法写法——s_stud是单个结构体指针,右侧却是两个结构体的初始化列表。正确的写法应该是定义结构体数组,比如struct student s_stud[] = {{13,"jacob"},{12,"lia"}},再基于数组取指针;或者给指针分配足够内存后再初始化。
回到核心问题:不能用(*(stud+i))->id这种方式访问结构体字段,原因如下:
- 当你把
struct student*强制转换为char*后,stud指向的是结构体(或结构体数组)的起始字节。*(stud+i)取出的是第i个字节的内容,类型是char,而非struct student指针/对象,->运算符要求左侧是指向结构体/联合体的指针,因此这种写法在语法上就不成立。 - 如果想通过字符指针间接访问结构体数组的元素,正确的做法是先将
char*转换回struct student*类型,再访问成员,示例代码:
这里必须用// 假设s_stud是结构体数组的指针,stud是转换后的char* struct student *target_ptr = (struct student*)(stud + i * sizeof(struct student)); printf("%d\n", target_ptr->id);sizeof(struct student)计算单个结构体的字节长度,保证指针移动的步长正确,避免因结构体内存对齐导致的越界或错误访问。
需要注意的是,C语言允许这种指针类型转换,但操作时必须确保内存访问的合法性:不能越界访问,且转换后的指针指向的内存必须是有效的struct student对象。
内容的提问来源于stack exchange,提问作者Solruhama
相关产品推荐
相关产品推荐

