在C语言中,指针相减并不总是指向同一数组的不同元素,这种做法是否有效?
根据C标准,下面这样的操作是否保证有效?我模糊地记得读过这是无效的。
int * a;
int * b;
a = (int*) 100;
b = (int*) 200;
printf("%d\n", b-a);
这会给我25吗?
这是未定义行为。
首先,那些指针并没有指向你拥有的内存。
你只能对指向同一数组内部(或者数组末尾后一个位置)的指针进行减法操作。
当然,在大多数编译器上它可能会正常工作,并且你会得到25
,因为在你的平台上sizeof(int) == 4
。如果它们是char *
,你会得到100。(可能会崩溃,这就是未定义行为的美妙之处)。
int *p = (int*) 100;
p++;
将导致p=104。
当然是未定义的。减去两个任意指针(视为整数)甚至不能保证是您对象大小的倍数。
printf("%td\n", b - a);
。 - mk12