编程C 开发人员

解释 C 语言中栈和堆之间的区别,以及何时更好地使用这两种内存类型?

用 Hintsage AI 助手通过面试

答案。

在 C 语言中,变量的内存可以在 (stack)或 (heap)中分配。

  • — 在进入函数时自动分配内存,并在退出时释放。速度快,但内存量受栈的大小限制(通常为几 MB)。
  • — 通过 malloccallocrealloc 动态分配内存,并通过 free 手动释放。内存量受系统能力限制,但访问速度较慢,并且手动控制释放内存。

何时使用栈:

  • 对于局部变量,如果它们的大小小且在编译时已知。
  • 对于函数参数和小数组。

何时使用堆:

  • 当内存大小事先未知时。
  • 对于大对象或长期存在的对象。

代码示例:

// 在栈中 int arr[10]; // 在堆中 int* parr = malloc(sizeof(int) * 10); // 别忘了释放内存 free(parr);

陷阱问题。

问题: 如果对通过 malloc 分配的数组没有调用 free 函数,会发生什么?

答案: 将发生内存泄漏 (memory leak)。动态分配的内存不会自动释放,随着时间的推移,这可能导致应用程序或整个系统的内存耗尽。

代码示例:

void leak() { int* leakArr = malloc(100 * sizeof(int)); // 没有调用 free(leakArr),内存丢失 }

故事

在一个项目中,程序员通过 malloc 为描述用户会话的结构分配内存,但忘记在会话结束时调用 free。结果,项目在几天内发生了内存泄漏,服务器因内存不足而“崩溃”。该问题仅在使用 Valgrind 进行性能分析并修复所有遗漏的 free 之后得以解决。


故事

开发人员在栈中为临时计算分配了一个大数组(最大 10 MB)。在栈小的服务器上,这导致应用程序因 stack overflow 错误而崩溃。经过分析,必须将缓冲区转移到堆中。


故事

一位开发人员决定将长字符串保存在栈中,但字符串的大小由用户主观指定。当输入非常长的字符串时,应用程序因内存访问错误而崩溃。最终决定将输入的数据转移到堆中并检查长度。