编程C 开发者

谈谈C语言中自动存储区(auto)的内存工作特点。使用位于栈上的变量时可能会出现哪些困难?

用 Hintsage AI 助手通过面试

答案

在C语言中,自动存储区(默认情况下为auto)的变量在其作用域(通常是函数)进入时在栈上创建,并在退出时自动销毁。

特点包括:

  • 只有在声明该变量的块内才能访问该变量。
  • 栈的大小是有限的,溢出会导致崩溃(栈溢出)。
  • 从函数返回自动变量的地址会导致未定义行为。

正确与错误使用的示例:

int* wrong() { int x = 42; return &x; // 错误:x在函数退出后会被销毁 } void correct() { int y = 123; printf("%d ", y); // 一切正常 }

隐含问题

如果从函数返回局部变量的地址,会发生什么?

常见错误答案: "指针会保留值"。

正确答案: 返回的地址在退出函数后变为无效,内存区域会被重新分配给其他自动变量或函数。使用这样的指针属于未定义行为。

示例:

int* myfunc() { int temp = 10; return &temp; // temp在返回后被销毁 } int main() { int* p = myfunc(); printf("%d ", *p); // 未定义行为 }

由于不熟悉该主题而导致的真实错误示例


故事

在一个大型银行系统项目中,程序员从用户定义的函数中返回了指向局部数组的指针以处理结果。系统运行不稳定:数据偶尔会被损坏或意外更改,导致报告中的昂贵错误。

故事

在外围设备驱动程序的代码中,程序员使用了栈缓冲区进行异步传输。传输开始与结束之间的延迟导致数据损坏,因为缓冲区在操作完成前就被销毁了。

故事

在医疗登记器的固件中实现了栈缓存以加快数据处理。在负载期间,栈溢出导致设备重启和患者数据丢失。