我正在查看一个同学发布的一些代码,为了这个例子,它已经被简化了:
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 如果重要的话。