设计一个程序(多源文件),程序中包含局部变量、局部静态变量、全局静态变量、全局变量、函数;将程序运行结果和编译信息结合在一起,通过运行结果和编译结果的讨论,说明上述不同存储类别的特性与区别。
时间: 2024-02-12 07:09:33 浏览: 59
好的,我会为您解答这个问题。
先来看一个示例程序:
```c
#include <stdio.h>
int global_var = 0; // 全局变量
static int static_global_var = 0; // 全局静态变量
void func1(void) {
int local_var = 0; // 局部变量
static int static_local_var = 0; // 局部静态变量
printf("func1:\n");
printf("global_var = %d\n", global_var);
printf("static_global_var = %d\n", static_global_var);
printf("local_var = %d\n", local_var);
printf("static_local_var = %d\n", static_local_var);
global_var++;
static_global_var++;
local_var++;
static_local_var++;
}
void func2(void) {
int local_var = 0; // 局部变量
static int static_local_var = 0; // 局部静态变量
printf("func2:\n");
printf("global_var = %d\n", global_var);
printf("static_global_var = %d\n", static_global_var);
printf("local_var = %d\n", local_var);
printf("static_local_var = %d\n", static_local_var);
global_var++;
static_global_var++;
local_var++;
static_local_var++;
}
int main(void) {
printf("main:\n");
printf("global_var = %d\n", global_var);
printf("static_global_var = %d\n", static_global_var);
func1();
func2();
printf("main:\n");
printf("global_var = %d\n", global_var);
printf("static_global_var = %d\n", static_global_var);
return 0;
}
```
上述程序包含了局部变量、局部静态变量、全局静态变量、全局变量、函数等不同的存储类别。下面分别说明它们的特性和区别。
**局部变量**
局部变量是定义在函数内部的变量,它只能在函数内部使用。局部变量的特点有:
- 只在定义它的函数中有效,出了这个函数就不能被访问。
- 每次进入函数都会重新初始化一次,离开函数后就会被销毁。
- 可以被定义为自动变量(即不加任何关键字),也可以被定义为 register 变量(即使用 register 关键字)。
在示例程序中,func1() 和 func2() 中都定义了局部变量 local_var 和局部静态变量 static_local_var。在每个函数中,这两个变量的值都会被重新初始化为0,而且它们之间互不影响。
**局部静态变量**
局部静态变量是定义在函数内部,但是在函数执行完毕后不会被销毁的变量。局部静态变量的特点有:
- 只在定义它的函数中有效,出了这个函数就不能被访问。
- 只会被初始化一次,不会在每次进入函数时重新初始化。
- 它的作用域仍然是定义它的函数内部,但是它的生存期和程序的运行周期一样长,即程序结束时才被销毁。
在示例程序中,func1() 和 func2() 中都定义了局部静态变量 static_local_var。在每个函数中,这两个变量的值不会被重新初始化,而且它们之间互不影响。
**全局变量**
全局变量是定义在函数外部,所有函数都可以访问的变量。全局变量的特点有:
- 在程序的整个生命周期内都是有效的,可以被程序中的任何函数访问。
- 在定义它的文件中可以直接使用,如果在其他文件中使用,则需要使用 extern 关键字进行声明。
- 在程序中只会有一份内存,如果在不同的文件中定义了同名的全局变量,则它们实际上是同一个变量。
在示例程序中,定义了全局变量 global_var。它可以被程序中的所有函数访问,并且它的值在不同的函数中是可以相互影响的。
**全局静态变量**
全局静态变量是定义在函数外部,但是只能在定义它的文件中被访问的变量。全局静态变量的特点有:
- 只在定义它的文件中有效,其他文件不能直接访问。
- 只会被初始化一次,不会在每次进入函数时重新初始化。
- 它的作用域仍然是整个程序,但是只能在定义它的文件中使用。
在示例程序中,定义了全局静态变量 static_global_var。它只能在 main.c 文件中被访问,其他文件不能直接访问它。它的值在不同的函数中是可以相互影响的。
关于编译信息,我们可以使用 GCC 编译器的 -Wall 和 -Werror 选项来打印编译信息。-Wall 选项表示打印所有警告信息,-Werror 表示将所有警告信息转化为错误信息。示例程序的编译命令如下:
```
gcc -Wall -Werror main.c func.c -o test
```
如果代码中存在一些潜在的问题,如未定义变量、函数声明不匹配等,编译时会报错,并提示哪些代码行存在问题。我们可以根据编译输出来修改代码,以保证代码的正确性和可靠性。
以上就是关于不同存储类别的特性和区别的详细说明。
阅读全文