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

と の両方がメモリ内の同じ場所pstructpstruct2指しているため (ptr両方に格納されているアドレスを割り当てたため)、メソッドによって挿入されたデータはMyStruct::storeメソッドによって上書きされましたMyStruct2::store

言い換えれば、これはあなたが明示的にそれを実現させているために起こっています。2 つのクラスが同一でない場合、またはコンパイラがそれらの異なるメモリ レイアウトを生成した場合、ガベージ データを読み込んでいた可能性があります。


基本的に、C++ では、動的に割り当てられた任意のメモリに好きなだけ書き込むことができます。幸いにも、このメモリを以前に別のオブジェクトに使用していたという事実を知らず、忘れることもありません。

于 2012-12-08T22:51:57.180 に答える
0

未定義の動作。たまたま正常に動作するふりをしています。

3.10 左辺値と右辺値 [basic.lval]

...

10 プログラムが、次の型以外の glvalue を介してオブジェクトの格納された値にアクセスしようとした場合、動作は未定義です。

— オブジェクトの動的タイプ

于 2012-12-08T22:51:53.613 に答える