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;
}