c - C:将变量传递给函数,这个设计有效吗?
问题描述
这个问题可能看起来太基础了,但请看一下:
#include <stdio.h>
void f3(int *p) {
*p = 100;
}
void f2(int *p) {
f3(p);
}
void f1(int *p) {
f2(p);
}
int main(int argc, char **argv) {
int a;
f1(&a);
printf("%d\n", a);
return 0;
}
基本上,堆栈变量 ( a
) 的地址被传递给调用堆栈下方的多个函数,在最后一个函数中其值被更改。
这种改变价值观的方式是一个好的设计吗?如果不是,什么应该是更好的设计?
出现我的问题是因为使用堆变量(比如a
如下所示的堆变量),这种设计是可以的,因为分配的内存对于所有函数都是“全局的”。
int main(int argc, char **argv) {
int *a = malloc(sizeof(int)*1);
f1(a);
printf("%d\n", a);
free(a)
return 0;
}
但是对于局部变量,我怀疑调用堆栈是否下降了 2 级,它仍然有效地仅使用一个级指针访问内存。我应该在每个函数调用下传递另一个级别的指针吗?(如f1(&a)
那时f2(&p)
等)。
解决方案
你在做什么是绝对正确的。变量a一直存在,f3会收到变量a的地址。完全没有问题。
推荐阅读
- javascript - nodejs 如何等待 `require('module').runMain()` 完成运行?
- r - 是否有比使用三感叹号选择更强大的重命名替代方法?
- python - 检查树是否为二叉搜索树时出错
- json - 如何使用 JSTL 打印 json 数据
- python - 如何在 mac 上使用 Cryptofeed python 库
- c# - Windows 窗体列表框在未创建时添加项目
- python - 如何将矢量场限制在一定半径的圆内?
- android - RecyclerView 回到位置 0
- angular - 如何使复选框的行为类似于角度 6 中的单选按钮?
- r - 在 R 中使用 ggplot 将参考线添加到条形图