如何在C中的两个函数之间共享变量?

时间:2013-11-27 22:11:21

标签: c function

在C中,假设var1是foo1()中的变量,而foo2()想要访问var1,但foo1()不会调用foo2(),所以我们不能通过参数传递它。同时,只有foo1()和foo2()才能访问它,所以我不想将它声明为全局变量。它将与朋友的语义相似[&34;在c ++中,有没有办法在C中实现它?

void foo1() {
  ... 
  var1;
  ....
}


void foo2() {
 ...
 how to access var1?
 ...
}

6 个答案:

答案 0 :(得分:4)

将变量传递给两个函数....一般函数不应该保持状态。

很快就会发现传递变量不是很好而且变得脆弱,所以相反,你传递结构....然后函数开始处理结构状态。

typedef struct 
{
    int var1;
} blah_t;

void foo1(blah_t* b)
{
    b->var1=0;
}

void foo2(blah_t* b)
{
    b->var1++;
}

这是做OO C背后非常简单的种子理念。

答案 1 :(得分:2)

您需要在函数范围之外声明var1,然后将其作为参数发送给两者。或者,将其声明为全局变量。

答案 2 :(得分:1)

通过引用是一种方式:(在此示例中,i的内存是caller()的本地内容)

void caller()
{
    int i = 5;
    foo(&i);
    bar(&i);
    printf("\n final i is %d",i);
}

void foo(int *i)
{
    printf("%d",*i);
    *i += 5;
}

void bar (int *i)
{
    printf("%d",*i);
    *i += 5;
}

全球:(通常认为可怕i的名称更像GLOBAL_I或其他内容)

int i = 0;

void caller()
{
   i=5;
   foo();
   bar();
   printf("\n final i is %d",i);
}

void foo()
{
   printf("%d",i);
   i += 5;
}

 void bar (int i)
 {
      printf("%d",i);
      i += 5;
 }

答案 3 :(得分:0)

没有。变量仅在foo1()运行时存在于函数堆栈中。离开功能时堆栈将消失。您可以将变量设置为静态以使其保持活动状态,但是如果没有黑客攻击,则无法从外部访问它。

答案 4 :(得分:0)

关于 与c ++中的“朋友语义”相似。 C不具备相同的能力 您还说: 因此我们无法通过参数传递

C 的唯一其他选项,用于从函数到函数访问变量而不作为函数参数传递,是使用某种类型的全局范围变量。 /> 以下具体说明当函数位于单独的.c模块中时如何执行此操作。

对于案例 ,其中void foo1()void foo2()存在于不同的C模块中...
但是您仍然希望能够访问同一个变量,并确保其值在项目的所有位置始终相同,然后考虑使用extern scope

两个模块共有一个标题文件 ,您可以拥有全局的 项目范围 版本

file.h

void foo1(void);
void foo2(void);
extern int var1;  

file1.c中

#include "file.h"
int var1 = 5;

int main(void)
{
    printf("value of var1 is %d\n", var1);//original value of var1
    foo1();
    printf("value of var1 is %d\n", var1);//var1 modified by foo1()
    foo2();
    printf("value of var1 is %d\n", var1);//var1 modified by foo2()
    return 0;
}

void foo1(void)
{
    var1 = 15;
}

file2.c中

#include "file.h"

void foo2(void)
{
    var1 = 20;
}

答案 5 :(得分:0)

这个答案的灵感来自许多其他语言中的“模块”概念,可以使用gcc的嵌套函数进行近似。变量var1foo1()foo2()的范围内,但不在其他所有范围内。该解决方案既不使用全局变量也不使用参数。

void foo(int fn)
{
    static int var1;

    void fn1(void)
    {
        var1 = 15;
    }

    void fn2(void)
    {
        var1 = 20;
    }

    (fn == 1)? fn1(): fn2();
    printf("Value of var1 is now %d\n", var1);
}

void foo1(void){foo(1);}
void foo2(void){foo(2);}

int main (void)
{
    foo1();
    // Expected stdout: Value of var1 is now 15

    foo2();
    // Expected stdout: Value of var1 is now 20
}