2012-05-11 2 views
3

일반 C, Windows 7 & HP 컴퓨터.memset에서 포인터 오프셋이 작동하지 않습니까?

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; 

} 

정수의 세 번째 바이트를 0x0으로 설정하려고하지만 동일하게 유지됩니다. 어떤 아이디어? 고맙습니다.

내 컴퓨터에서 int는 32 비트입니다.

답변

7

포인터의 덧셈/뺄셈은 1 바이트만큼 이동하지 않습니다 - 포인터가 가리키는 대상의 유형의 크기만큼 이동합니다.

int *q = &p[1] 

당신이를 증가하려면 : 당신이 운영자의 인덱스를 사용하는 경우 (4 바이트 정수 가정)라고하는 것입니다

,

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

기본적으로, 동일합니다 포인터를 하나씩 이동하여 unsigned char *으로 전송하십시오. 당신이했던 것처럼, 변수 a의 일부가 아니었던 메모리를 덮어 쓰고 기존 데이터를 다른 것으로 덮어 쓰는 것이 었습니다.

+1

실제로 비트 AND 연산자를 사용하여 할 거라고, 당신은 (INT의 *)'에 대해 아무것도지지 않습니다 0 + 1 '그것이'! = 0', 이후 널 포인터 것을 제외 특별히 처리 될 수 있습니다. –

+0

@larsmans bah humbug : P NULL도 0이라고 가정 할 수 없습니다. P하지만 내 게시물을 변경했습니다. 힘내 친구 야. –

+0

오른쪽으로, 유형의 크기만큼 증가합니다. 완전 무언가. 고맙습니다. 1 분 안에 수락하십시오. – jn1kk

2

사실 b + 2는 2 바이트가 아닌 2 바이트의 변위입니다. 사실

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

당신은

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

INT 만 적어도 두 바이트 보장 세 번째 바이트를 수정하려면, 그래서 당신은 세 번째 바이트를 설정하려는 경우 당신은 (긴 INT를 사용한다 또는 uint32_t). 어쨌든,

unsigned long a = 4294967293; 
/* regular code */ 
a &= 0xFFFF00FF;