关于C++对象内部指针算术运算合法用法的技术问询
关于C++对象内部指针算术运算合法用法的技术问询
嘿,我来给你拆解这段出自Patrice Roy《C++ memory management》里的代码示例,帮你搞懂C++里**指针可互转换(pointer interconvertibility)**的合法用法:
For example, the following code is correct, albeit not something one should seek to do (it makes no sense, and it does things in unnecessarily complicated ways, but it’s legal and does no harm):
struct A { int a; short s; }; short * f(A &a) { // pointer interconvertibility in action! int *p = reinterpret_cast<int*>(&a); // 通过指针偏移指向结构体的下一个成员 return reinterpret_cast<short*>(p + 1); }
咱们来掰扯清楚这段代码的合法性和槽点:
- 合法性来源:C++标准规定,类的第一个非静态数据成员的指针和类对象本身的指针是指针可互转换的——也就是说
&a(A类型指针)和&a.a(int类型指针)指向的是同一块内存起始地址,用reinterpret_cast在这两个类型之间转换是完全合规的。 - 为啥说它没意义:直接写
&a.s就能拿到short成员的指针,完全没必要绕这么一大圈做指针转换和算术运算,这纯粹是为了演示规则才写的“反常识”示例。 - 为啥不会出问题:结构体A的内存布局里,
a是第一个成员,在忽略内存对齐的情况下,紧跟其后的s的地址就是&a.a + sizeof(int),所以p+1正好指向s的起始地址,再转成short*是安全的,不会触发未定义行为。
总之,这段代码的核心价值就是帮你理解“指针可互转换”这个规则,实际开发中可别这么写,纯属炫技式的规则演示~
内容来源于stack exchange
相关产品推荐
相关产品推荐

