0

有人可以向我解释一下数据是如何被利用的,因为我在搞乱以下代码......:

#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 分配更多内存,但我能够访问它。任何人都可以向我解释,或者至少给我一个参考/教程来解释它。

4

2 回答 2

4

两者pstruct和都pstruct2指向内存中的相同位置(因为您将存储在两者中的地址分配ptr给两者),因此该方法插入的数据被该MyStruct::store方法覆盖MyStruct2::store

换句话说,这是因为你明确地让它发生了。如果你的两个类不相同,或者编译器产生了不同的内存布局,你可能会读出垃圾数据。


基本上,C++ 允许您尽可能多地写入任何动态分配的内存,很高兴地忽略和忘记了您之前曾将此内存用于另一个对象的事实。

于 2012-12-08T22:51:57.180 回答
0

未定义的行为,恰好成功地假装它有效。

3.10 左值和右值 [basic.lval]

...

10 如果程序尝试通过非下列类型之一的左值访问对象的存储值,则行为未定义:

— 对象的动态类型

于 2012-12-08T22:51:53.613 回答