关于未初始化全局变量

本文探讨了未初始化全局变量的存储空间分配机制,并通过实验验证了这些变量在进程创建时由操作系统自动分配空间的特点。此外,还对比了初始化与未初始化变量在内存占用上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天发现未初始化全局变量一些特性,后来在一篇博客上发现有人说过这个问题

这是原博文地址 blog.youkuaiyun.com/liuqiaoyu080512/article/details/8455652

然后结合原博文,自己又做了几个实验

以下算是自己实验一遍以后的总结:

首先,自己曾经以为未初化的全局变量也要在程序(不是正在运行的进程)中占有空间,但是后来发现这是错的. 未初始化的全局变量获得相应大小的空间应该是在操作系统创建进程的时候分配(且是分配heap堆内的空间,不是DATA数据段), 和指针的初始化需要手动完成相比,这是自动的.(还有就是部分初始化和初始化的效果是一样的)


int kross[1024*1024]={0,1};
int main(){
 return 0;
}

这样编译完以后的结果:

我们发现test(编译完以后的out文件)的文件大小是包含部分初始化全局变量的


当我们不初始化时

int kross[1024*1024];
int main(){
 return 0;
}

结果是:

以上说明编译器在编译的时候会根据全局变量是否初始化而做出储存空间优化


2,未初始化全局变量的空间分配会自动完成

先运行test文件,然后ps -a找到test的pid,再根据pid查看进程的详细状态:

从图中可以发现VmData的大小是包含变量的大小的


相反当我们将变量改为指针时,这个时候VmData的大小就变小了,操作系统没有自动分配


还有就是原博文说初始化了的变量在创建进程时VmData的大小也不大,主要是由于操作系统不是将一个程序完全加载到内存

<think>我们正在讨论的是C/C++语言中的初始化全局变量。在C和C++中,全局变量(也称为外部变量)在定义时如果没有显式初始化编译器会将其初始化为零值。这是因为全局变量存储在程序的静态存储区(包括BSS段),该区域在程序加载时会被初始化为零。 注意:局部变量则不同,它们不会被自动初始化,其值是定义的(垃圾值)。 因此,对于问题“初始化全局变量默认值是多少”,答案是:在C/C++中,初始化全局变量默认值为0(或对应类型的零值,如NULL、0.0等)。 示例: int global_var; // 默认值为0 char *global_ptr; // 默认值为NULL double global_double; // 默认值为0.0 但是,请注意,这个规则仅适用于全局变量和静态局部变量(用static修饰的局部变量)。非静态的局部变量不会自动初始化。 根据要求,在回答后需要提出3-5个相关问题,且第一行必须是“§§相关问题§§”,然后列出问题。 因此,回答如下:</think>在C/C++语言中,**初始化全局变量默认值为0**(或对应类型的零值)。这是由语言标准规定的行为,具体机制如下: --- ### 初始化规则详解: 1. **存储位置决定初始化** - **全局变量**:存储在程序的`.bss`段(初始化数据段),加载时由操作系统自动清零 - **局部变量**:存储在栈上,**不会自动初始化**,值为内存残留数据(垃圾值) 2. **不同数据类型的零值表现**: | 数据类型 | 默认值 | |-------------------|-----------------| | `int` | 0 | | `float`/`double` | 0.0 | | 指针类型 | `NULL` | | `bool` (C++) | `false` | | 数组/结构体 | 所有成员置零 | 3. **静态变量的特殊处理** `static int x;` // 静态变量也遵循零初始化规则,即使声明在函数内 --- ### 底层原理: - **编译阶段**:编译器将初始化全局变量标记到`.bss`段 - **程序加载时**:操作系统为`.bss`段分配内存并执行**零页填充** - **执行效率**:相比显式初始化(占用可执行文件体积),零初始化节省磁盘空间 --- ### 验证代码示例: ```c #include <stdio.h> int global_int; // 默认为0 char *global_ptr; // 默认为NULL int main() { static int static_var; // 同样为0 int local_var; // 初始化,值为随机垃圾数据 printf("全局整型: %d\n", global_int); // 输出0 printf("全局指针: %p\n", global_ptr); // 输出(nil)/0x0 printf("静态变量: %d\n", static_var); // 输出0 printf("局部变量: %d\n", local_var); // 输出随机值(定义行为) return 0; } ``` > ⚠️ **警告**:依赖初始化局部变量的值是**定义行为**(UB),可能导致程序崩溃或安全漏洞
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值