在C语言中,变量的声明和初始化是一个关键的基础,具有非常严格且有时不明显的规则。您声明变量的位置和方式将决定其初始值(关于初始化)以及与内存对象的关系(关于声明和定义)。
C语言可以追溯到内存优化优先的时代。开发人员必须自己声明和初始化变量,否则程序的行为将变得不可预测。在现代C编译器中,即使是微小的偏差也会导致链接错误或隐式初始化为“垃圾”。
主要错误:
代码示例:
#include <stdio.h> int global_var; // 定义,自动初始化 = 0 static int static_global_var; // static文件,自动初始化 = 0 extern int extern_var; // 声明,定义在其他地方 void foo() { int local_var; // 自动,未初始化 -> 垃圾 static int static_local_var; // static,自动初始化为0 }
关键特点:
1. 自动变量(局部无static和extern)是否会被编译器自动初始化为0?
不,它们包含垃圾。其值未定义,使用未初始化的变量是错误的。
2. 可以在不同的文件中多次用extern定义变量吗?
不,需要一个定义,其余是通过extern的声明,否则链接器会给出“multiple definition”或“undefined symbol”的错误。
3. 函数的声明与定义有什么区别?
声明只是原型(没有主体);定义必须包含函数主体。对于变量,通过extern的声明不分配内存,而对于函数,两种形式都是允许的。
在两个头文件中声明全局变量int counter;。项目链接时出现multiple definition错误。
优点:
缺点:
在头文件中写extern int counter;,定义int counter = 0;——只在一个C文件中。
优点:
缺点: