C 语言 static

2025年8月2日 | 阅读 6 分钟

在 C 编程语言中,`static` 关键字是一个存储类说明符。这些静态变量只初始化一次,并一直保持其值直到程序结束。`static` 可用于变量和函数,即我们可以声明静态变量和静态函数。普通变量仅限于其定义所在的范围,并且每次块执行时都会重新初始化。静态变量具有相同的范围,但在函数调用之间保留其值。

C 语言中 `static` 关键字的语法

它具有以下语法:

  • 数据类型: 数据类型 (int, char, float 等)。
  • 变量名: 变量的名称。
  • 值: 初始值 (如果未指定,默认为 0)。

C 语言中 `static` 关键字的基本示例

让我们用一个例子来说明 C 语言中的 `static` 关键字。

示例

编译并运行

输出

Function called 1
Function called 2
Function called 3

说明

在此示例中,我们使用了声明为 `static` 的 `count` 变量。此函数仅初始化一次,并在函数调用之间保留其值。之后,每次调用 `displayCounter()` 时,`count` 都会递增并打印更新后的值。

C 语言中 `static` 关键字的用法

C 语言中的 `static` 关键字有多种用法。以下是一些:

1. 静态局部变量

在 C 编程中,静态局部变量使用 `static` 关键字在函数内部声明。它们在函数调用之间保留其值,同时仅限于函数内部。

C 语言中静态局部变量的示例

让我们用一个例子来说明 C 语言中的静态局部变量。

示例

编译并运行

输出

Student Name: Jhonson
Roll Number: 1001

Student Name: Daniel
Roll Number: 1002

Student Name: Peter
Roll Number: 1003

说明

在此示例中,我们使用了 `static` 变量 `roll_num`,它会在多次调用 `addStudent()` 时保留其值。之后,每个学生都被分配一个从 1001 开始的唯一滚动编号,并且每次函数调用都会递增。

2) 静态全局变量

当使用 `static` 关键字声明全局变量时,其可见性仅限于当前文件,无法在同一项目中的其他文件中访问。这有助于封装变量并防止命名冲突。

C 语言中静态全局变量的示例

让我们用一个例子来说明 C 语言中的静态全局变量。

示例

编译并运行

输出

The Global Count is: 10

说明

在此示例中,我们使用了在全局级别声明为 `static` 的 `global_count_variable`,这将其可见性限制在此文件内。之后,`print()` 函数访问并打印其值。

3) 静态函数

在 C 编程中,使用 `static` 关键字声明的函数只能在其定义的文件的范围内访问。它阻止其他文件访问它,从而可以在大型 C 项目中更有效地封装辅助函数。

C 语言中静态函数的示例

让我们用一个例子来说明 C 语言中的静态函数。

示例

编译并运行

输出

Welcome to the static block!

说明

在此示例中,我们将 `greet()` 函数声明为 `static`,这意味着它具有内部链接,并且只能在同一个源文件中访问。之后,`main()` 函数调用 `greet()` 函数,它会打印欢迎消息。

关于 C 语言中静态变量的重要注意事项

关于 C 语言中静态变量有几个重要点需要记住。以下是一些:

生命周期和函数调用

静态变量在其定义的函数完成执行后,在程序运行时会一直保留其值。另一方面,普通 (auto) 变量在函数结束后就会被销毁。

内存分配

静态变量存储在内存的数据段中,而不是栈上。这就是为什么它们在整个程序中保持不变,而不是在函数终止时被销毁。

默认初始化

如果静态变量没有显式初始化,它将默认设置为 0,就像全局变量一样。当局部 (auto) 变量未初始化时,它们包含垃圾值。

C 语言中默认初始化的示例

让我们用一个例子来说明 C 语言中的默认初始化。

示例

编译并运行

输出

0
32545

初始化规则

静态变量只能使用常量字面量(如 0、5 或 'A')进行初始化。我们不能用函数返回值或运行时表达式来初始化它们。
此限制不适用于 C++,因为静态变量可以使用非常量值进行初始化。

静态函数和全局变量

在 C 语言中,我们可以声明静态全局变量和静态函数来限制它们的范围仅限于声明它们的文件。这意味着它们无法从项目中的其他文件访问,这使得代码模块化并防止了名称冲突。

结构体内的静态变量

在 C 语言中,结构体内部不能声明静态变量。原因是所有结构体成员都必须存储在单个内存块中。如果在结构体内部插入静态变量(来自数据段),则会违反此规则,并且结构体布局将无效。

静态变量和全局变量之间的区别

在 C 编程中,全局变量是在函数外部声明的变量。这些全局变量在程序开始时就存在,并且它们的范围一直持续到程序结束。它们也可以在程序外部访问。另一方面,静态变量仅限于它们定义的源文件,即其他源文件无法访问它们。

静态变量和全局变量都具有静态初始化。这里,静态初始化意味着如果我们不为变量分配任何值,那么默认情况下,变量将被赋予 0 值。

C 语言中静态变量的属性

以下是 C 语言中静态变量的属性。

  • 静态变量的内存分配在静态变量内部。
  • 其内存在整个程序中都可用,但其范围将与自动局部变量相同。
  • 其值将在不同的函数调用之间保持。
  • 如果我们不为变量分配任何值,则默认值为 0。
  • 全局静态变量不能在程序外部访问,而全局变量可以被其他源文件访问。

C 语言中的 Static 常见问题解答

1) C 语言中的 `static` 关键字到底有什么作用?

在 C 编程中,`static` 关键字可确保变量在函数调用之间保留其值,并在全局使用时将变量或函数的范围限制在文件中。

2) C 语言中的静态变量在内存中的哪个位置?

静态变量存储在内存的数据段中,而不是栈上;因此,它们在程序的执行期间保持不变。

3) C 语言中静态变量的默认值是什么?

在 C 语言中,如果静态变量没有显式初始化,它会自动设置为 0。

4) C 语言中可以在结构体中声明静态变量吗?

否,在 C 语言中不能在结构体中声明静态变量,因为所有结构体成员都必须连续存储在内存中,这与静态变量的存储方式相矛盾。

5) C 语言中为什么要使用静态函数?

在 C 语言中,静态函数将函数的范围限制在声明它的文件中,这可以减少多文件项目中的名称冲突并促进模块化。