有人可以向我解释数据是如何被利用的,因为我正在搞乱以下代码......:
#include <stdio.h>
#include <stdlib.h>
typedef struct MyStruct {
public:
void print() {
printf("MyStruct.print():\n\ta: %i\n\tb: %i\n\n", a, b);
}
void store() {
a = 2;
b = 3;
}
private:
int a, b;
};
typedef struct MyStruct2 {
public:
void print() {
printf("MyStruct2.print():\na: %i\nb: %i\n\n", a, b);
}
void store() {
a = 1024;
b = 3077;
}
private:
int a, b;
};
int main() {
void *ptr = malloc(sizeof(MyStruct)); // sizeof(MyStruct) == sizeof(MyStruct2)
MyStruct* pstruct = (MyStruct*)ptr;
pstruct->store();
pstruct->print();
MyStruct2* pstruct2 = (MyStruct2*)ptr;
pstruct2->store();
pstruct->print();
return 0;
}
我得到了以下结果:
MyStruct.print():
a: 2
b: 3
MyStruct.print():
a: 1024
b: 3077
正如您所看到的,我没有为pstruct2分配更多内存,但我能够访问它。任何人都可以向我解释,或者至少给我一个参考/教程来解释它的内容。
答案 0 :(得分:4)
pstruct
和pstruct2
都指向内存中的相同位置(因为您已将ptr
中存储的地址分配给两者),因此MyStruct::store
插入的数据方法被MyStruct2::store
方法覆盖。
换句话说,这种情况正在发生,因为您明确地实现了它。如果你的两个类不相同或者编译器产生了不同的内存布局,你可能会读出垃圾数据。
基本上,C ++允许您根据需要写入任何动态分配的内存,很高兴无知并且忘记了之前将此内存用于其他对象的事实。
答案 1 :(得分:0)
未定义的行为,碰巧成功地假装它有效。
3.10左值和右值[basic.lval]
...
10如果程序试图通过glvalue以外的方式访问对象的存储值 行为未定义的以下类型之一:
- 对象的动态类型