在C语言中,变量的初始化方式根据存储语义不同而有所不同:
例子:
void example() { int a; // 自动,未初始化 static int b; // 初始化为0 printf("a=%d, b=%d ", a, b); } int c; // 全局,初始化为0
错误起源于对初始化的错误假设。为安全起见,请始终显式初始化变量。
如果自动局部变量在函数级别但不在块中声明,是否初始化为0?
回答:
不!即使变量在函数的开始声明,但没有显式初始化,它也包含垃圾值:
void f() { int x; printf("%d ", x); // UB: x未初始化 }
故事
在银行软件中,函数内遗漏了初始化下一个计数器,导致有时它是一个巨大的负数——结果:客户收到了错误的奖励,错误仅在处理真实数据时被发现。
故事
在启动的多媒体图像处理程序中,假设静态数组总是填充零。切换到另一种编译器(具有非标准环境)后,发现了段错误——部分内存并没有实际分配给进程。
故事
在加密库中,开发者没有初始化密码的临时缓冲区,认为来自全局部分的缓冲区填充为零,但遇到了内存问题,旧的敏感数据仍然存在。这导致了密码在转储时的泄露。