减去指针后的输出

时间:2018-03-27 19:41:30

标签: c pointers malloc

基本上当我运行它时,它会打印1和2。 首先,ptr2 - ptr应该是4,因为我看到指向这样的东西的指针,其中每个| |代表一个字节:

|0|0|0|0| 0|0|1|0|
ptr..........ptr2

当我们减去指针时,我们减去它们指向的地址,对吧?所以我希望打印4然后打印2,因为内存已经连续分配。

当然这不是实际输出。那么我的想法在哪里不正确?

#include <stdio.h>
#include <stdlib.h>

int main(void) 
{
    int *ptr;
    ptr = (int *)malloc(2*sizeof(int));

    int *ptr2;

    ptr2 = &ptr[1];

    printf("%d\n", ptr2 - ptr);

    ptr[1] = 2;
    printf("%d", ptr2[0]);

    free(ptr);

    return 0;
}

1 个答案:

答案 0 :(得分:3)

当你减去两个指针时,结果不是数值之间的差异,而是元素的数量差异。

由于ptr指向数组的第一个元素而ptr2指向第二个元素,因此两者之间存在一个元素差异,这就是结果。

关于Additive Operators的C standard的第6.5.6节声明如下:

  

9 当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组最后一个元素的元素   宾语; 结果是两者下标的差异   数组元素。

如果要查看地址之间的字节差异,可以将指针强制转换为char *

char *p1 = (char *)ptr;
char *p2 = (char *)ptr2;
printf("%td\n", p2 - p1);