编程嵌入式C开发者

在C语言中,如何初始化不同存储类型的变量(自动的、静态的、全局的)?这对程序的安全性和正确性有什么影响?

用 Hintsage AI 助手通过面试

答案

在C语言中,变量的初始化方式根据存储语义不同而有所不同:

  • 自动(局部)变量:如果未显式指定初始值,则具有未初始化(垃圾)值。它们的内容是之前的栈内存。
  • 静态局部和全局变量 (static, extern):在链接时始终初始化为(标量为0,指针为NULL)或指定值。

例子:

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未初始化 }

由于对主题细微差别的无知而导致的实际错误示例


故事

在银行软件中,函数内遗漏了初始化下一个计数器,导致有时它是一个巨大的负数——结果:客户收到了错误的奖励,错误仅在处理真实数据时被发现。


故事

在启动的多媒体图像处理程序中,假设静态数组总是填充零。切换到另一种编译器(具有非标准环境)后,发现了段错误——部分内存并没有实际分配给进程。


故事

在加密库中,开发者没有初始化密码的临时缓冲区,认为来自全局部分的缓冲区填充为零,但遇到了内存问题,旧的敏感数据仍然存在。这导致了密码在转储时的泄露。