C语言中,声明但未初始化的变量会表现出不同的行为,取决于变量的存储类型。在C中,未初始化变量的行为涉及到内存中存储的内容,它们有时会有一个未定义的值(称为不确定值),而有时会被系统自动初始化为特定值。

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、动态分配的内存

使用 malloccallocrealloc 等函数动态分配的内存具有不同的初始化行为,mallocrealloc,分配的内存不进行初始化,因此包含不确定值。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;
}

推荐文档