C语言指针类型转换疑问:为什么srcpt不需要定义为双指针**srcpt?
问题解答
核心误区澄清
你产生这个疑问主要是两个常见的理解偏差:
- 搞混了两个结构体的
b成员类型
你用到的dstptr是dummya_t*类型,对应的结构体定义如下:
这里的成员typedef struct dummya { int a; int b; } dummya_t;b是int类型的普通整数变量,不是指针也不是数组,不要和另一个结构体dummy_t里的数组成员b混淆。 - 对强制类型转换的目标类型判断错误
代码(dummy_t*)(dstptr->b)的作用,是把dstptr->b存储的整数值,强制转换为一个指向dummy_t类型内存的地址值,转换后的结果本身就是dummy_t*类型的单指针,赋值给同类型的srcpt自然不需要用双指针**srcpt。
补充说明
这段代码本身属于非常不规范的危险写法:
- 直接将int类型整数强制转换为指针的行为可移植性极差,在int长度小于指针长度的架构(比如64位系统下int通常是4字节,指针是8字节)下会出现地址截断,导致非法内存访问
- 除非你明确确认
dstptr->b中存储的整数值确实是一块合法的、可供访问的dummy_t类型内存的地址,否则这段代码运行一定会触发崩溃或未定义行为
内容的提问来源于stack exchange,提问作者Peace9795
相关产品推荐
相关产品推荐

