c - 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
解决方案
从 开始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;
把 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
返回。
回到里面main
,printf("%d %d", y, x);
打印 和 的y
内容x
。既然y
没变,现在还是1。既然x
变了,现在是3。
推荐阅读
- ios - 如何更改表单中的 NavigationLink 箭头颜色
- python - tkinter Canvas 窗口未从 Powershell 打开
- ios - 如何在任何特殊字符之前添加额外的空格
- vue.js - 超过最大调用堆栈大小 Vuetify
- hystrix - org.springframework.cloud.netflix.hystrix.dashboard.HystrixDashboardConfiguration$ProxyStreamServlet.doGet - Spring Cloud Turbine Streams
- c# - mongodb-C# - 尝试读取流的末尾?
- c - 将两个字符串中的常用字符添加到新字符串中
- java - 在简单 JPA 存储库中哪里可以找到数据库表对象
- winforms - 如何使用异步创建文件和缩略图?
- javascript - 过滤从当月第一天到当前日期的日期