1、自动变量(局部变量)
自动变量是指在函数内部声明的局部变量,通常在栈上分配内存。自动变量在声明后如果没有被显式初始化,其内容是未定义的,即它们的初始值为不确定值。栈上的内存通常不会被清零,因此未初始化的局部变量可能包含栈中已有的“垃圾”数据。读取这些变量会产生不可预测的结果。
#include <stdio.h> void example() { int x; // 局部未初始化变量 printf("Uninitialized local variable x: %d\n", x); // x 的值不确定 } int main() { example(); return 0; }
2、静态变量(包含全局和静态局部变量)
静态变量包括全局变量和使用 static
关键字声明的局部变量,它们在程序的整个生命周期中存在,并在数据段或BSS段分配内存。在C语言中,静态存储类型的变量(包括全局变量和静态局部变量)会被自动初始化为零。对于整数类型,默认初始化为 0
。对于浮点类型,默认初始化为 0.0
。对于指针类型,默认初始化为 NULL
。
#include <stdio.h> int global_var; // 未初始化的全局变量 static int static_var; // 未初始化的静态局部变量 void example() { static int local_static_var; // 未初始化的静态局部变量 printf("Global variable: %d\n", global_var); // 输出 0 printf("Static variable: %d\n", static_var); // 输出 0 printf("Local static variable: %d\n", local_static_var); // 输出 0 } int main() { example(); return 0; }
3、动态分配的内存
使用 malloc
、calloc
或 realloc
等函数动态分配的内存具有不同的初始化行为,malloc
和 realloc
,分配的内存不进行初始化,因此包含不确定值。calloc
分配的内存会自动初始化为零。
#include <stdio.h> #include <stdlib.h> int main() { int *ptr1 = (int *)malloc(4 * sizeof(int)); // 未初始化内存 int *ptr2 = (int *)calloc(4, sizeof(int)); // 初始化为零的内存 printf("malloc variable: %d\n", ptr1[0]); // 不确定的值 printf("calloc variable: %d\n", ptr2[0]); // 输出 0 free(ptr1); free(ptr2); return 0; }