调试指针算术

时间:2011-02-11 20:05:43

标签: c pointers

我无法解决为什么在打印变量地址

之间的区别时发现差异

以下是代码:

int main()
{

        int *a,b = 5,e = 0;
        int *c,d = 10,f = 0;
        long t1,t2;
        a = &b;
        c = &d;
        e = &b;
        f = &d;
        t1 = e - f;
        t2 = a - c;
       printf("\n Address of b using a: %x \t %d using e : %x \t %d value of b : %d",a,a,e,e,b);
       printf("\n Address of d using c: %x \t %d using f : %x \t %d value of d : %d",c,c,f,f,d);
       printf("\n Value of t1 : %d",t1);
       printf("\n Value of t2 : %d \n",t2);
}

这是输出:

 Address of b using a: bf9e9384   -1080126588 using e : bf9e9384  -1080126588 value of b: 5

 Address of d using c: bf9e9380   -1080126592 using f : bf9e9380  -1080126592 value of d: 10


 **Value of t1 : 4
 Value of t2 : 1**

为什么将t1和t2分配给相似的差异

时,它们之间存在差异

请告诉我。

2 个答案:

答案 0 :(得分:8)

ac是指针,因此获取指针的不同会返回它们之间的元素数量ef是整数(其值只是bd的地址);取整数差异实际上只是一个减法,所以它返回字节数

注意(1):由于两个指针的差异不是指向同一个数组的元素而产生的行为是 undefined

注意(2):int分配地址所产生的行为是实现定义的

注意(3):两个指针的区别在于ptrdiff_t类型,其大小为实现定义。因此,将此分配给long也是实现定义的

注意(4):在同一行(例如int *a,b = 5,e = 0;)混合指针和非指针的声明被认为是非常糟糕的做法,因为它令人难以置信的混乱!

答案 1 :(得分:0)

您看到不同值的原因是e-fint算术,而a-cint*算术。在int*算术中,差异是可以放在两个指针之间的ints的数量,因此4字节整数的结果是4倍。

这就是说,减去两个不指向同一个数组的指针称为“未定义行为”,理论上任何事情都可能发生。