C语言函数中void指针类型用法:const void*参数为何要强转赋值
核心原因是const修饰符的类型匹配要求
- 首先看两个变量的类型差异:
- 函数入参
data的类型是const void *:这代表该指针指向的内容不允许通过这个指针修改,给入参加const是为了让接口更安全,向调用方承诺函数本身不会修改data指向的内容 - 结构体
ListElmt里的data成员类型是void *:无const修饰,允许通过该指针修改指向的内容
- 函数入参
- C语言中,直接将
const void *类型的指针赋值给void *类型的变量,编译器会抛出警告,提醒你正在移除指针的const只读属性,可能引发非法修改常量数据的风险。这里加(void *)的强制类型转换,就是为了显式告诉编译器「这个转换是开发者主动做的,确认风险可控」,从而抑制告警。
补充说明
这个写法是通用数据结构实现的常见设计取舍:
- 接口层加
const保证调用安全:调用方即使传入const修饰的数据指针也能正常调用,不用手动做类型转换 - 存储层去掉
const保证通用性:链表本身只负责存储指针,不干涉上层对数据的读写权限,后续上层如果明确知道数据是可修改的,依然可以通过链表存储的void *指针修改内容
注意:这个转换存在潜在风险,如果调用方传入的是实际存储在只读内存的
const数据,后续通过链表的data指针修改内容会触发未定义行为,严重时会导致程序崩溃,需要上层使用者自行保证使用逻辑合法。
内容的提问来源于stack exchange,提问作者noobee
相关产品推荐
相关产品推荐

