首页 > 编程笔记 > C语言笔记 阅读:41

C语言中的全局变量和局部变量(非常详细)

根据作用域(即变量可以被访问的范围),可以将 C语言中的变量分为两类,分别是:


简单来说,全局变量是“全局可见”的,而局部变量是“局部私有”的。

C语言全局变量的基本用法

全局变量通常声明在程序的顶部,位于所有函数之外。它们在整个程序运行期间都存在,且所有函数都可以直接访问。

以下是一个简单的例子:

#include <stdio.h>

int globalVar = 10;  // 全局变量

void printGlobal() {
    printf("Global variable: %d\n", globalVar);
}

int main() {
    printGlobal();
    globalVar = 20;  // 修改全局变量
    printGlobal();
    return 0;
}

输出结果:

Global variable: 10
Global variable: 20

在这个例子中,globalVar 是全局变量,定义在函数外部。无论是 main() 函数还是 printGlobal() 函数,都可以直接访问和修改它。


全局变量的特点包括:


例如,未初始化的全局变量:

#include <stdio.h>

int uninitializedGlobal;  // 未初始化,默认值为 0

int main() {
    printf("Uninitialized global: %d\n", uninitializedGlobal);
    return 0;
}

输出结果:

Uninitialized global: 0

C语言局部变量的基本用法

局部变量定义在函数内部或代码块(如 { })内部,只能在定义它的范围内使用。离开该范围后,变量的内存会被自动释放。

来看一个例子:

#include <stdio.h>

void printLocal() {
    int localVar = 5;  // 局部变量
    printf("Local variable: %d\n", localVar);
}

int main() {
    printLocal();
    // printf("%d\n", localVar);  // 错误:localVar 在此不可见
    return 0;
}

输出结果:

Local variable: 5

在这个例子中,localVar 是 printLocal() 函数内的局部变量,main() 函数无法访问它。如果尝试在 main() 中访问 localVar,编译器会报错。


局部变量的特点包括:


例如,未初始化的局部变量:

#include <stdio.h>

int main() {
    int uninitializedLocal;  // 未初始化,值未定义
    printf("Uninitialized local: %d\n", uninitializedLocal);
    return 0;
}

输出结果:

Uninitialized local: [随机值]

由于 uninitializedLocal 未初始化,其值可能是内存中的任意数据,使用时可能导致不可预测的结果。

同名的局部变量和全局变量

当全局变量和局部变量同名时,会发生遮蔽(shadowing),即局部变量会暂时“覆盖”全局变量。

来看一个例子:

#include <stdio.h>

int x = 100;  // 全局变量

void printX() {
    int x = 50;  // 局部变量,遮蔽全局变量
    printf("Local x: %d\n", x);
}

int main() {
    printX();
    printf("Global x: %d\n", x);
    return 0;
}

输出结果:

Local x: 50
Global x: 100

在 printX() 函数中,局部变量 x 的值是 50,它遮蔽了全局变量 x(值为 100)。但在 main() 函数中,访问的仍是全局变量 x。

全局变量和局部变量的优缺点

全局变量虽然方便,但在使用时需要权衡利弊:


例如,一个滥用全局变量的例子:

#include <stdio.h>

int counter = 0;

void increment() {
    counter++;
}

int main() {
    increment();
    increment();
    printf("Counter: %d\n", counter);
    return 0;
}

输出结果:

Counter: 2

虽然代码简单,但 counter 可能在程序的其他地方被意外修改,导致难以追踪的错误。
 

相比之下,局部变量更受推崇:


推荐做法是将变量尽量定义为局部变量,只有在确实需要全局共享时才使用全局变量。

为了更清晰地理解两者的区别,我们用表格总结如下:

 

特性 全局变量 局部变量
定义位置 函数外部 函数或代码块内部
作用域 整个程序 定义它的函数或代码块
生命周期 程序运行期间 进入到离开作用域
默认值 0(未初始化时) 未定义(未初始化时)
内存位置 数据段

全局变量和局部变量的使用注意事项

在使用全局变量和局部变量时,有几个常见问题需要注意。

1) 未初始化风险

未初始化的局部变量,它的值是一个随机值。在使用局部变量时,务必赋值后再使用。

2) 全局变量滥用

程序中存在过多的全局变量,会使程序难以维护,尽量用参数或返回值替代。

3) 生命周期误解

不要在函数里返回局部变量的地址,例如 int *f() { int x; return &x; },因为当 f() 函数执行结束后,函数占用的内存空间会被释放掉,局部变量 x 也随之被销毁了,返回它的地址没有任何意义。

相关文章