减去两个指针,给出意想不到的结果

Moh*_*ber 0 c pointers subtraction

#include <stdio.h>

int main() {
    int *p = 100;
    int *q = 92;
    printf("%d\n", p - q);  //prints 2
}
Run Code Online (Sandbox Code Playgroud)

上述程序的输出不应该是8吗?

相反,我得到2.

das*_*ght 12

除了未定义的行为,这是您使用指针算法获得的行为:当减去指针是合法的时,它们的差异表示指针之间的数据项的数量.在情况下int,您的系统上使用每四个字节int,即八个字节的方式,是指针之间的差异(8 / 4),其中工程出来2.

这是一个没有未定义行为的版本:

int data[10];
int *p = &data[2];
int *q = &data[0];
// The difference between two pointers computed as pointer difference
ptrdiff_t pdiff = p - q;
intptr_t ip = (intptr_t)((void*)p);
intptr_t iq = (intptr_t)((void*)q);
// The difference between two pointers computed as integer difference
int idiff = ip - iq;
printf("%td %d\n", pdiff, idiff);
Run Code Online (Sandbox Code Playgroud)

演示.