如何在C中访问具有相同名称的局部变量和全局变量

时间:2020-10-04 11:36:20

标签: c scope declaration

我在学校有这个作业,我必须找到以下C代码的输出,并解释其输出。

#include<stdio.h>
int i;
void fun1(void);
void fun2(void);
int main()
{
    fun1();
    fun2();
    return 0;
}

void fun1(){
    i=20;
    printf("%d\t",i);
}

void fun2(){
    int i=50;
    printf("%d",i);
}

输出为20 50 因为在fun1()中,全局变量'i'被分配给20并被打印。在fun2()中,变量“ i”是一个局部变量,该变量被声明并初始化为50,然后将其打印出来。

出于好奇,我有以下问题,如何在fun2()中使用全局变量'i'? 一个简单的解决方案是简单地更改名称并避免整个事情。但是我的好奇心是由于Java,在Java中有一个关键字“ this”来访问类变量而不是局部变量。

那么在C语言中有什么方法可以做到这一点?

4 个答案:

答案 0 :(得分:3)

唯一的方法是在代码块中隐藏局部变量的声明。

例如

#include <stdio.h>

int i = 10;

void fun2( void )
{
    int i = 20;
    printf("local i = %d\n",i);

    {
        extern int i;
        printf( "global i = %d\n",i);
    }
}

int main(void) 
{
    fun2();
}

程序输出为

local i = 20
global i = 10

答案 1 :(得分:2)

无法访问具有相同名称的局部变量的函数内部的全局参数。尽管如您所见,在C中创建这样的局部变量通常是不好的做法,但并不禁止这样做。 在C ++中,您可以使用名称空间来解决它,但是在C语言中没有等效项。

答案 2 :(得分:1)

最好的方法是将参数传递给函数

void fun2(int fromExternalWorld){
    int i=50;
    printf("%d ",fromExternalWorld);
    printf("%d\n",i);
}

int main(void)
{
    fun2(i);
}

否则,在同一个作用域中无法看到两个具有相同名称的符号。

答案 3 :(得分:0)

您可以在声明局部i之前作弊并创建一个指向全局i的指针:

void fun2( void )
{
  int *ip = &i; // get address of global i
  int i = 50;   // local i ”shadows" global i
 
  printf( "local i = %d, global i = %d\n", i, *ip );
}

编辑

看到这个答案被接受,我必须强调,您应该从不编写这样的代码。这是围绕不良编程实践的创可贴。

在可能的情况下避免使用全局变量,并且在不可能的情况下使用明确将其标记为全局且不太可能被遮盖的命名约定(例如,前缀为g_或类似名称)

我无法告诉您,我浪费了多少个小时来追查像这样的命名冲突引起的问题。