计算并输出两个指针的差异

时间:2013-12-27 11:47:04

标签: c pointers

以下c程序的输出是1.有人可以解释一下吗?

#include<stdio.h>
#include<string.h>
int main(){
    int a = 5,b = 10,c;
    int *p = &a,*q = &b;
    c = p - q;
    printf("%d" , c);
    return 0;
}

3 个答案:

答案 0 :(得分:7)

程序调用未定义的行为。指针减法必须使用指向同一数组元素的指针来完成。

来自C标准:

  

(C99,6.5.6p9)“当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素[...]”

答案 1 :(得分:0)

变量在堆栈中一个接一个地分配。在具有4字节大小的整数的机器上说地址可以说是1000和1004;差别是4个字节;指针运算表明差异应该返回元素中的值(而不是字节),因此地址之间的元素数(int)是1(整数)。

但是,这仅在同一个数组中或在它之后的一个元素中有效,这在您的示例中并非如此,因此未定义。

C ++11§5.7/ 6

  

当减去指向同一数组对象的元素的两个指针时,   结果是两个数组的下标的差异   elements ...除非两个指针都指向同一个数组的元素   对象,或者是数组对象的最后一个元素之后的行为   未定义。

编辑:谢谢你让我在这个问题上查找C ++标准。

答案 2 :(得分:0)

使用int 指针算术作为计量单位,返回两个连续堆栈分配指针的内存位置差异。

从技术上讲,程序行为是 undefined 。因此,再说毫无意义。