首页 > 解决方案 > c中变量机制的范围

问题描述

变量作用域的机制如何工作(局部、静态和全局)?

我不明白这个输出:

void foo1(int *z)
{
  z = (int *)malloc(sizeof(int));
  *z = 3;
}

void foo2(int *t)
{
  *t = 3;
}

void main()
{
  int y = 1;
  int x = 2;
  foo1(&y);
  foo2(&x);
  printf("%d %d", y, x);
}

输出: 1 3

标签: c

解决方案


从 开始mainint y = 1;创建一个名为的本地对象并将y其初始化为 1。

然后int x = 2;创建一个名为的本地对象并将x其初始化为 2。

然后在传递它的地址时foo1(&y);调用。foo1y

其中foo1(int *z),参数z实际上是函数的局部对象foo1。作为foo1开始,z包含 的地址y

然后z = (int *)malloc(sizeof(int));分配内存并将该内存的地址分配给z. 这个变化z,所以z不再包含的地址y

然后*z = 3;把 3 放在点的地方z,也就是现在分配的内存。所以分配的内存的内容发生了变化。y不改变是因为z不再指向y,因为z = (int *)malloc(sizeof(int));改变了z

然后foo1返回和 main 调用foo2(&x);,它在将 .foo2的地址传递给它时调用x

其中foo2(int *t),参数t实际上是函数的局部对象foo2。作为foo2开始,t包含 的地址x

然后*t = 3;将 3 放在t点的位置。由于t指向x,这改变了 的内容x,所以现在x包含 3。

然后foo2返回。

回到里面mainprintf("%d %d", y, x);打印 和 的y内容x。既然y没变,现在还是1。既然x变了,现在是3。


推荐阅读