在下面的C程序中,如何访问其他文件中的静态变量


#include <stdio.h>
#include <stdlib.h>
int function(int);
int main()
{
int a=1;
extern b;//can be only declared
printf("a=%dn",function(a));
printf("b=%dn",value());
return 0;
}
int function(int v)
{
return v+1;
}

file1.c:中

static int b=20;
int value() //can't be used on a static function
{
return b;
}

在上面的代码中,虽然我将变量b设置为static,但它可以从其他文件访问。如何访问它,因为static关键字不应该允许从其他文件访问变量,对吗?我有点困惑。

此语句

static int b=20;

意味着变量b将仅在其翻译单元中可见,即在您定义的file1.c中。

main()中,它应该在另一个文件中,你只声明了b,但没有使用它。尝试使用它,你会发现链接器会失败,因为它找不到b的定义。

int main()
{
int a=1;
extern int b;    // note the type int in declaration. You have missed it.
printf("access b = %dn", b);   // <==== this won't work
return 0;
}

试着用上面的更改编译你的程序,你会看到链接器会抛出错误。

main()中进行了上述更改后,只需从file1.c文件中的变量b定义中删除static关键字,上述程序就会成功链接,因为b将是一个具有外部链接的全局变量。

value()返回变量b保持的,该值与b静态还是

非静态静态变量的生存期是程序的整个运行过程。如果您有静态变量的地址,则可以在其作用域/转换单元之外访问该静态变量。检查此项:

文件file1.c:

#include <stdio.h>
static int b = 20;
int * retaddr_b (void) {
return &b;
}
void print_b (void) {
printf ("b = %dn", b);
}

文件main.c:

int * retaddr_b (void);
void print_b (void);
int main(void)
{
print_b();                 // print static variable b value 
int * ptr_b = retaddr_b(); // ptr_b pointing to b
*ptr_b = 99;               // dereference ptr_b and assign different value
print_b();                 // print static variable b value
return 0;
}

输出:

b = 20
b = 99

它在那里并没有真正被访问,除非你在编译时看到以下警告:

warning: type defaults to ‘int’ in declaration of ‘b’ [-Wimplicit-int]

您所要做的只是打印函数value的返回值。

如果你真的想看看它是否被访问,请检查以下内容:

注释您的printf("b = %dn",value());并在其位置使用printf("b = %dn",b);
,然后编译并检查。

最新更新