#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。
1
时,结果将指向相同类型的下一个位置。假设arr == 12
,那么ptr1 == 12
,然后ptr1 + 3
==15
,所以ptr2 == 15
。现在,如果你在添加+
之前将ptr1
转换为int*
,则(int*)ptr1 + 1
=16
,对于sizeof (int*) == 4
的系统而言。 - Grijesh Chauhan(int*)ptr1
没有正确对齐(取决于平台),所以对其进行取消引用可能会出现问题。但是,如果指针对齐不正确,甚至减法本身也可能是UB吗? - Aaron McDaid