使用C中的指针进行练习会产生不明确的输出

时间:2018-06-13 16:10:30

标签: c pointers

这是我老师的代码:

#include <stdio.h>
void foo1(int xval){
    int x;
    x = xval;
    printf("Address of x: %p\nValue of x: %d\n", &x, x);
}
void foo2(int dummy){
    int y;
    printf("Address of y: %p\nValue of y: %d\n", &y, y);
}
int main(void){
    foo1(7);
    foo2(11);
    return 0;
}

这是产生的输出:

screenshot of the output of the execution

任何人都可以解释我为什么?

1 个答案:

答案 0 :(得分:2)

stack after call                     stack after call 
to foo1()                            to foo2()
+----------------+                   +----------------+    |
| stack frame of |                   | stack frame of |    |
| main()         |                   | main()         |    v
++++++++++++++++++ <-- same addr --> ++++++++++++++++++   stack
| stack frame of |                   | stack frame of |   growth
| foo1()         |                   | foo2()         |
+----------------+                   +----------------+

现在foo1()的堆栈帧中x的地址与foo2()的堆栈帧中y的地址相同。

这是因为两个函数具有相同数量和类型的参数和局部变量(被推入堆栈)。在调用foo1()时,x的地址中的值(在您的情况下为0x7fff63387a84)设置为7.由于foo1()和foo2()之间没有其他函数调用,此值仍然存在。

注意此答案仅供您理解。你不应该依赖于y的值,因为它是未初始化的(如前面的评论中所指出的)。这仅仅是一种意外现象。我建议你了解堆栈框架是如何形成的。