首页 > 解决方案 > 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)等)。

标签: c

解决方案


你在做什么是绝对正确的。变量a一直存在,f3会收到变量a的地址。完全没有问题。


推荐阅读