如何使一个函数中的变量对其他函数可见

时间:2013-03-16 19:23:39

标签: c scope

说我有类似的内容

void init(void){
    int foo = 0;
}
void useFoo(void){
    foo++;
}
void main{
    init();
    useFoo();
}

我们有一个初始化一个(或多个)变量的init函数,然后是另一个必须使用该变量的函数(或者可能是多个函数),如何使“int foo”对其他函数可见?

3 个答案:

答案 0 :(得分:2)

您可以在全局范围内显示它:

int foo;

void init()
{
    foo = 0;
}

void useFoo()
{
    ++foo;
}

此外,您可以将指针传递给需要它的变量:

void init(int *foo)
{
    *foo = 0;
}

void useFoo(int *foo)
{
    (*foo)++;
}

...
int foo;
init(&foo);
useFoo(&foo);

或者你可以使用线程本地存储,文件,其他媒体,但我相信你不希望这样:)

答案 1 :(得分:1)

简短的回答是“你不能”(至少不是这样)。 foo中的变量init是在init的条目处创建的,然后在从init返回时被销毁。调用useFoo已不再存在。

您需要变量具有更长的“存储持续时间”(程序级生命周期)。您可以通过使其具有“静态持续时间”(通过static关键字并将其移出函数外部来实现这一点 - 尽管实际上,移出它就足够了),在这种情况下只有一次实例(“单身” “在许多其他语言的分类法中。或者,您可以构建使用malloc创建的数据结构,为数据提供“已分配的持续时间”:它从malloc开始持续到free之后(我们将会暂时忽略realloc :-))。

分配持续时间方法更麻烦但更灵活。

答案 2 :(得分:0)

简化方法是将其作为全局变量:

int foo;
void init(void) {
    foo = 0;
}
void useFoo(void) {
    foo++;
}
void main(void) {
    init();
    useFoo();
}

另一种方法是使用指针:

#include <stdio.h>

void init(int *foo) {
    *foo = 0;
}
void useFoo(int *foo) {
    (*foo)++;
}
void main(void) {
    int foo;
    init(&foo);
    useFoo(&foo);
    useFoo(&foo);
    useFoo(&foo);
    printf("%d\n", foo);
}

最后一个是将它作为参考传递(使用CPP时,而不是C):

#include <stdio.h>

void init(int &foo) {
    foo = 0;
}
void useFoo(int &foo) {
    foo++;
}
int main(int argc, char** argv) {
    int foo;
    init(foo);
    useFoo(foo);
    useFoo(foo);
    useFoo(foo);
    printf("%d\n", foo);
    return 0;
}