나는 반 친구가 게시 된 일부 코드를 찾고 있어요 그리고이 예제를 위해 단순화되었습니다C 코드 포인터 퍼즐
이int main()
{
int n = 0x4142;
char * a = (char *) &n;
char * b1 = (((char *) &n) + 1);
char * b2 = (((int) &n) + 1);
printf("B1 Points to 0x%x - B2 Points to 0x%x\n", b1, b2);
printf("A Info - 0x%x - %c\n", a, *a);
printf("B1 Info - 0x%x - %c\n", b1, *b1);
printf("B2 Info - 0x%x - %c\n", b2, *b2);
return 0;
}
출력은 : 그것은 오류를 세그멘테이션
B1 Points to 0xcfefb03d - B2 Points to 0xcfefb03d
A Info - 0xcfefb03c - B
B1 Info - 0xcfefb03d - A
Segmentation fault (core dumped)
b2를 인쇄하려고 할 때. 반면 출력에는 오류가 발생하는 대신 다음 줄이 포함되어야한다고 생각하는 반면 :
B2 Info - 0xcfefb03d - A
왜 이런 경우입니까? b1과 b2는 모두 char *이고, 둘 다 동일한 주소를 가리 킵니다. 이것은 64 비트 머신에서 sizeof (char *) == 8이고 sizeof (int) == 4 인 경우에 해당합니다.
내가 프로그램에 오류가 표시 해달라고 : http://codepad.org/VU8upOdl – karthikr
그래, 그게 내 급우가 지적한 문제 야. 코드 패드에는 문제가 없지만 64 비트 컴퓨터에서는 문제가 발생합니다. 모두 OS X 10.7 64 비트 및 우분투 리눅스 64 비트. –
'% x'은 인수를'unsigned int'로 해석합니다 (C11 §7.21.6.1.8). 포인터를 인쇄하려면'% p'를 사용해야합니다. – DCoder