变量作用域的机制如何工作(局部,静态和全局)?
我不明白这个输出:
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
答案 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
打印y
和x
的内容。由于L
并未更改,因此仍为1。由于{0,1}
并未更改,因此现在为3。