C变量机制的范围

时间:2018-09-29 17:49:36

标签: 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

2 个答案:

答案 0 :(得分:0)

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

我不确定您为什么使用malloc,但是*z最终指向您刚刚用malloc分配的内存的内存地址。因此,覆盖原始指针意味着更改不会反映在原始main()方法中。

更清楚一点: 您有一个指针* z指向y中的main()。当您使用malloc时,它会返回一个指针,因此,当您将其分配给z时,它现在指向与{无关的 different 内存块。 y中的{1}}。然后,您为这个新的内存块分配main()的值。因此,原始3不变。

答案 1 :(得分:0)

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

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

然后foo1(&y);在向foo1传递地址y的同时调用foo1(int *z)

z中,参数foo1实际上是函数foo1本地的对象。 z开始时,y包含地址z = (int *)malloc(sizeof(int));

然后z分配内存,并将该内存的地址分配给z。这将更改z,因此y不再包含*z = 3;的地址。

然后z将3放置在y所指向的位置,该位置现在是分配的内存。因此,分配的内存的内容会更改。 z不会更改,因为y更改了z = (int *)malloc(sizeof(int));z不再指向foo1

然后foo2(&x);返回并主调用foo2,该调用在向x传递地址foo2(int *t)的同时调用t

foo2中,参数foo2实际上是函数t本地的对象。 x开始时,*t = 3;包含地址t

然后t将3放在x所指向的位置。由于x指向x,因此更改了foo2的内容,所以现在main包含3。

然后printf("%d %d", y, x);返回。

回到y的内部,x打印yx的内容。由于L并未更改,因此仍为1。由于{0,1}并未更改,因此现在为3。