面试题答案
一键面试- NULL指针与内存分配函数的关系
- malloc:
malloc
函数用于分配指定字节数的内存空间。如果分配成功,它返回一个指向已分配内存起始地址的指针;如果分配失败,它返回NULL
。例如:
int *ptr = (int *)malloc(sizeof(int)); if (ptr == NULL) { // 处理内存分配失败的情况,比如提示用户内存不足等 printf("Memory allocation failed\n"); return; }
- calloc:
calloc
函数用于分配指定数量和指定大小的内存空间,并将其初始化为0。与malloc
类似,分配成功返回指向已分配内存的指针,失败返回NULL
。例如:
int *arr = (int *)calloc(10, sizeof(int)); if (arr == NULL) { printf("Memory allocation failed\n"); return; }
- malloc:
- NULL指针与内存释放函数的关系
- free:
free
函数用于释放先前通过malloc
、calloc
或realloc
分配的内存空间。当使用free
释放指针所指向的内存后,该指针就成为悬空指针。为了避免悬空指针问题,可以在free
后将指针赋值为NULL
。例如:
int *ptr = (int *)malloc(sizeof(int)); // 使用ptr free(ptr); ptr = NULL;
- free:
- 在复杂动态内存管理场景下避免问题的方法
- 避免内存泄漏:
- 确保对每一个成功分配内存的操作(
malloc
、calloc
、realloc
),都有相应的free
操作。在代码逻辑复杂的情况下,可以使用一些调试工具(如Valgrind)来检测内存泄漏。 - 当在函数中分配内存并返回指针时,调用者必须清楚何时需要释放该内存。例如:
char *createString(const char *str) { char *newStr = (char *)malloc(strlen(str) + 1); if (newStr == NULL) { return NULL; } strcpy(newStr, str); return newStr; } int main() { char *str = createString("Hello"); if (str!= NULL) { // 使用str free(str); str = NULL; } return 0; }
- 确保对每一个成功分配内存的操作(
- 避免悬空指针:
- 如上述提到的,在
free
指针后立即将其赋值为NULL
。 - 在使用指针前,始终检查指针是否为
NULL
。特别是在可能释放指针的复杂逻辑中,每次使用指针前都要进行检查。例如:
int *ptr = (int *)malloc(sizeof(int)); if (ptr!= NULL) { // 使用ptr free(ptr); ptr = NULL; } if (ptr!= NULL) { // 这里不会执行,避免了悬空指针访问 *ptr = 10; }
- 如上述提到的,在
- 避免内存泄漏: