当我们递增下面的类型转换指针时会发生什么?
What happens when we increment the below typecasted pointer?
如果我们递增指向类型转换为int类型的类的指针会发生什么?
#include<bits/stdc++.h>
using namespace std;
class Hello{
int x=2;
int y=3;
public:
void print(){
cout<<"This is class Hello";
}
};
int main() {
Hello *h=new Hello();
int *i=(int *)h;
i++; //What will i point to?
}
我的问题是,如上面的代码所示,一旦递增,我指向什么?
我还有另一个疑问——我知道记忆是连续的,记忆是连续分配给类的吗?
P.S:这个问题是在接受东芝软件采访时问我的
半官方回答:这是未定义的行为,程序在增量后所做的任何事情都是公平的游戏。说真的,任何事情。
如果你这样做,运行你的程序,它会破解你的银行账户,没关系。它没有违反你写它的方式。
不过,有一个复杂因素。符合"PoD"或"普通数据"的定义(链接中的完整定义)。这样的结构保证像 C 结构一样布局。考虑到这一点,您可能会像预期的那样将其指向y
,甚至可以声称这在该语言的规范范围内。
话虽如此,为什么#@$&!(@#你会做这样的事情吗?如果两个不同的事物驻留在同一个内存位置,请使用union
。
这是一个未定义的行为。
实际上,新i
将指向Hello
分配实例开头的四个字节(sizeof(int)
),并且有很多机会指向Hello.y
。
这个类确实可能是连续分配的。在其他情况下,可以强制实施对齐约束,并导致字段之间的填充。
相关文章:
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用基类指针调用基类的值构造函数的语法是什么?
- 将指针分配给另一个指针时会发生什么情况?
- 当该数组的索引中没有元素时,指针指向什么?
- C++:Lambda 函数指针转换的用例是什么?
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 如果我在 const 函数上使用指针,我可以返回什么?
- 为什么此指针值不能转换为整数的规则是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 以下与指针相关的代码的输出是什么?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- C++:在向量中插入什么 - 指针或引用,矢量何时复制它的元素?