我正在开发一个 C 程序,需要为结构数组动态分配内存。我知道使用 malloc 有时会失败,返回 NULL。但是,我不确定处理这些情况以防止未定义行为或内存泄漏的最佳实践。
这是我的代码的简化版本:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id;
char name[50];
} Item;
int main() {
int n;
printf("Enter the number of items: ");
scanf("%d", &n);
Item *items = (Item *)malloc(n * sizeof(Item));
if (items == NULL) {
fprintf(stderr, "Memory allocation failed\n");
return 1;
}
free(items);
return 0;
}
我的问题是:
任何指导或最佳实践将不胜感激!
- 我当前的错误处理足以检测内存分配失败吗?
代码中的主要问题与
malloc
并不真正相关,而是您采用未经净化的输入并将其直接提供给程序。您应该检查 scanf
是否失败。或者更好的是,尽可能完全避免 stdio.h
。
在专业程序中,您需要健全性检查
n
是否在给定的范围内。使用有符号整数来表示数组大小也是没有意义的,因为它永远不可能为负数。
- 我可以采取哪些额外步骤来确保大型应用程序中稳健的内存管理?
总的来说,这是一个很好的做法:
free
后立即将每个指针设置为 NULL。此外,对于少量内存,通常不需要首先动态分配内存。在大多数情况下,只有几百字节的数据可以安全地分配在堆栈上。
- C 中是否有任何特定的调试技术来跟踪内存泄漏或分配问题?
有静态分析或动态分析的工具。
静态分析器在编译时检查代码(超出编译器已经可能或可能不检查的范围),例如数组越界访问、悬空指针错误等。动态分析器在程序运行时检查程序是否存在错误,并且能够通过这种方式发现内存泄漏。
示例:如今,gcc 有一些用于静态和动态分析的选项,请查看仪器选项。例如
-fsanitize=address
,它可以发现很多与内存相关的问题。对于其他免费开源选项,还有 Clang-Tidy、Valgrid、Frama-C 等工具。