编程C开发者

什么是C语言中的'未定义行为'?请举例说明其发生的情况以及如何最小化这些问题。

用 Hintsage AI 助手通过面试

答案。

**未定义行为(UB)**是程序的行为,其结果在C语言标准中未定义。编译器或系统可以执行任何操作——从无明显错误到完全崩溃或数据损坏。

典型的UB原因:

  • 数组越界访问
  • 解引用未初始化/无效的指针
  • 除以0
  • 修改常量

如何最小化UB:

  • 始终初始化变量
  • 检查数组索引
  • 使用静态和动态代码分析工具(例如,valgrind,AddressSanitizer)

代码示例:

int arr[5]; arr[10] = 0; // UB — 数组越界 int* p = NULL; *p = 42; // UB — 解引用NULL指针

陷阱问题。

问题: 如果执行一个整数除以零,程序会表现得如何?

答案: 根据C标准(ISO C99 6.5.5),除以0是未定义行为。可能发生崩溃、产生垃圾或甚至得到"逻辑上正确"的输出,但标准没有保证任何结果。

代码示例:

int a = 10, b = 0; printf("%d", a / b); // 未定义行为

历史

在一个嵌入式系统的项目中,程序员写了一个遍历数组的循环,不小心超出了数组的界限一个元素。应用程序正常工作,但一个月后开始出现内存中其他数据的损坏(短暂的错误,难以重现)。问题只有在仔细审查和使用静态分析工具检查后才被发现。


历史

开发人员认为解引用NULL指针总是会导致崩溃,因此没有添加对NULL的检查。然而在一个罕见的平台上,这导致了不正确(但不致命)的内存修改,破坏了其他结构并导致难以捕捉的bug。


历史

在生成伪随机数时使用了除法,在某些输入参数值下会出现除以0的情况。在大多数平台上,程序会直接崩溃,但在其中一个平台上,结果是一个不正确的数字,导致各个环境之间难以重现bug。