【发布时间】:2013-10-29 11:53:46
【问题描述】:
#include<stdio.h>
int main()
{
char arr[] = "somestring";
char *ptr1 = arr;
char *ptr2 = ptr1 + 3;
printf("ptr2 - ptr1 = %ld\n", ptr2 - ptr1);
printf("(int*)ptr2 - (int*) ptr1 = %ld", (int*)ptr2 - (int*)ptr1);
return 0;
}
我明白了
ptr2 - ptr1
给出 3 但无法弄清楚为什么第二个 printf 打印 0。
【问题讨论】:
-
提问是否投反对票?
-
@Jerry ,我没有。这是我参加的一些 C 测验。我弄错了。
-
尝试调试并检查值(观看)
-
@lan 根据指针数学当你添加
1然后结果将指向相同类型的下一个位置假设arr == 12然后ptr1 == 12然后ptr1 + 3==15等等ptr2 == 15。现在ptr1==12在添加+然后(int*)ptr1 + 1=16为sizeof (int*) == 4的系统之前添加int*。 -
这是未定义的行为(UB)吗?取消引用
(int*)ptr1将是,因为它没有正确对齐(取决于平台)。但也许连减法本身也是 UB 的指针对齐不正确?