c++ - 为什么`main`函数中的局部int变量会自动初始化?
问题描述
我是 C++ 新手,在学习 C++ 时遇到了这个问题。
这是代码
#include <iostream>
using namespace std;
void another_func() {
int a;
cout << a << endl;
}
int main() {
int a;
cout << a << endl;
another_func();
}
我正在使用g++ (GCC) 10.1.0
,我发现每次运行代码时,函数a
内部main
都会初始化为0
,而a
inanother_func
将是一个随机数。如下,
➤ g++ test.cpp && ./a.out
a in main: 0
a in another_func: 32612
据我所知,局部变量存储在堆栈中,它们没有自动初始化机制。所以a
inanother_func
是预期的。但是,有人能告诉我为什么a
inmain
函数被初始化为0
吗?
提前致谢!
解决方案
未初始化并不意味着非零,它可以有任何值。在许多操作系统上,新分配的内存页面被填满,0
因此在非调试代码中,未初始化的值通常0
也是如此。
您的程序的行为是未定义的,但可能发生的情况是,a
要么main
是第一次使用堆栈,要么你很幸运,并且在main
离开堆栈的那个区域之前运行的初始化代码0
。
调用cout
将写入堆栈,因此当您执行another_func
堆栈内存时将0
不再是全部。
推荐阅读
- node.js - 我的全栈 vue express 应用程序登录应用程序错误
- python - 用“INF”替换 NaN 值
- c++ - QWebSocket Hello World 示例
- android - 单击后退按钮转到上一个活动
- python - 为创建的过滤列设置特定值
- angular - 在 url 字符串中插入模板值
- python - 在python中导入邮递员集合
- remote-access - openvpn 主机到主机访问子网家庭到远程
- javascript - 如果完全在视图中(大于视口),intersectionObserver 获得比率 1
- python-3.x - 如何使用python将xml块添加到原始xml结构中