C++中未显式初始化的变量为何会出现非0的意外初始值?
问题原因解释
- 你对C变量初始化规则存在认知误区:仅静态存储期的变量(全局变量、被
static修饰的局部变量)会被默认零初始化,而你代码中定义在main函数内的final_sum、sum都属于自动存储期的局部变量,存储在栈内存中,C标准并未规定这类变量会被自动初始化,它们的初始值是对应内存地址之前残留的任意脏数据,你看到的初始值16只是当前运行环境下栈内存的遗留值,完全不具备确定性,换设备、换编译器甚至同环境多次运行都可能得到不同的结果,这类未初始化就读取的行为属于典型的未定义行为。 - 你代码中还存在另一处同类问题:
sum变量同样未初始化就直接执行sum += i操作,也会导致计算结果异常。
修复方案
在定义变量时显式指定初始值即可,修改后的代码如下:
#include <iostream> #include <iomanip> #include <cmath> using namespace std; int main() { // 所有变量显式初始化 int n = 0, sum = 0, final_sum = 0; cout<<"ff: "<<final_sum<<endl; cout<<"Input the value for n: "; cin>>n; for(int i=1; i<=n; i++){ sum += i; final_sum += sum; cout<<"sum: "<<sum<<endl; cout<<"final sum: "<<final_sum<<endl<<endl; } return 0; }
内容的提问来源于stack exchange,提问作者soup
相关产品推荐
相关产品推荐

