3

プレーンC、Windows7およびHPマシン。

int main(void) {

    unsigned int a =  4294967295;
    unsigned int *b = &a;

    printf("before val: '%u'\n", *b); // expect 4294967295, got 4294967295

    memset(b+2, 0, 1);

    printf("after val: '%u'\n", *b);
    // little endian          4th      3rd     2nd       1st
    // expect 4278255615 - 11111111 00000000 11111111 11111111
    // got    4294967295 - 11111111 11111111 11111111 11111111

    return 0;

}

整数の3番目のバイトを0x0に設定したいのですが、同じままです。何か案は?ありがとうございました。

私のマシンでは、intは32ビットです。

4

3 に答える 3

7

ポインタの加算/減算は1バイトだけ移動するのではなく、ポイントされているオブジェクトのタイプのサイズだけ移動します。

つまり(4バイト整数を想定)、

int *p = 0x00004
int *q = p+1;
assert(q == 0x00008)

基本的に、演算子のインデックスを使用した場合と同じです。

int *q = &p[1]

ポインタを1つインクリメントする場合は、ポインタをにキャストしunsigned char *ます。あなたがそれをした方法では、あなたは変数の一部ではなかったメモリを上書きしa、おそらく他の何かのために既存のデータを上書きしていました。

于 2012-05-11T15:25:32.090 に答える
2

b + 2は、実際には2バイトではなく2intの変位を意味します。

 unsigned int *b = &a;
 memset(b+2, 0, 1);

実際、3番目のバイトを変更したい

 unsigned int *b = &a;
 memset( ((char*)b)+2, 0, 1);
于 2012-05-11T15:27:03.373 に答える
0

intは少なくとも2バイトであることが保証されているため、3番目のバイトを設定する場合は、long int(またはuint32_t)を使用する必要があります。とにかく、私はビットごとの演算子を使用してそれを行います

unsigned long a = 4294967293;
/* regular code */
a &= 0xFFFF00FF;
于 2012-05-11T15:27:37.183 に答える