0

重複の可能性:
C++ のポインター演算では、バイトのインクリメントではなく sizeof(type) のインクリメントが使用されますか?

答えを見つけようとしましたが、できませんでした。次の C++ コードがあります。

struct A {
    uint16_t a;
    uint16_t b;
    uint16_t c;
}

int main() {
    uint16_t * B = new uint16_t[5000];
    for (int i=0;i<5000;i++)
        B[i] = i;

    uint16_t * D = &B[500]+sizeof(A);
}

質問: この後、なぜ *D=512 なのですか? sizeof(A) = 6 をデバッグすると、本来あるべき状態になります。それでも、B [500] のメモリ アドレスに A のサイズを追加すると、6 ではなく 12 が追加されます。

お知らせ下さい。

ありがとうございました!

4

1 に答える 1

4

sizeof(A)が実際に 6の場合、コンパイラのバグです。

&B[500] + 6 == &B[506]

したがって、*D506 になるはずです。そして、それは私がコンパイルするときです

#include <iostream>
#include <cstdint>

struct A {
    uint16_t a;
    uint16_t b;
    uint16_t c;
};

int main() {
    uint16_t * B = new uint16_t[5000];
    for (int i=0;i<5000;i++)
        B[i] = i;

    uint16_t * D = &B[500]+sizeof(A);
    std::cout << (*D) << std::endl;
    return 0;
}

g++-4.7.1 または clang++-3.1 で。

于 2013-01-27T22:50:20.563 に答える