输出不应为2 2

时间:2019-11-08 08:19:19

标签: c gdb

    int i = 0, j = 1; 
    void func(int *p, int *q) 
    { 
        p = q; //Here the address of p and q are made same. 
      * p = 2; // value @ address pointed by 'p'(which is q) is now set to 2.
    }     
    int main() //Start of Main
    { 
        func(&i, &j); 
        printf("%d %d n", i, j); 
        return 0; 
    }
when address held in p and q are same , i'm not understanding why the output isn't same as well (2 2).
</code>
If i fire up gdb i see the following
(gdb) p &p 
$4 = (int **) 0x7fffffffebc8   <<Actual address of var p                                                                 (gdb) p &q                                                                               
$6 = (int **) 0x7fffffffebc0   << Actual address of var q                                                       (gdb) n                                                                                          17      }                                                                                    
(gdb) p p                                                                                    
$8 = (int *) 0x601040 <j>    << After the func ends its pointing only to 'j'                                                                
(gdb) p q                                                                                    
$9 = (int *) 0x601040 <j>

这与main()func()之间的堆栈不同有关吗?

据我所知指向'i'的地址被'j'覆盖了吗?

任何人都可以纠正我的理解吗?

2 个答案:

答案 0 :(得分:1)

在C中,参数作为副本传递。因此.then()p是在q中传递的原始地址&i&j的副本。因此,当您这样做时:

func(&i, &j);

p = q; //Here the address of p and q are made same. p现在确实相同,都是q的地址。因此,当您这样做时:

j

它将* p = 2; // value @ address pointed by 'p'(which is q) is now set to 2. 指向的内容(即p)设置为j

2完全没有被修改,因此仍然是i。您将地址0作为参数i传递,但是当您将p设置为p时,您立即丢弃了该地址。

答案 1 :(得分:0)

最初在Global范围内,i和j值分别为0和1。函数调用时,传递了i和j的地址(位置)。

Here, 
*p = i,
*q = j;

在函数callee中,p和q保留i和j的地址。 分配时,p = q q被分配给p,这意味着p也保存着j的地址。然后,*p = 2设置p指向的地址的值。 p当前指向j。因此在打印时j的值为2,i的值保持不变。在这种情况下,我们没有任何指向i的指针。我们仅通过i修改i值。

希望这会有所帮助:)