面试题答案
一键面试- realloc在当前内存块后续空间不足时的做法:
- realloc通常会在堆内存中寻找一块大小为新请求大小(这里是20 * sizeof(int))的连续内存块。如果找到合适的内存块,它会将原内存块的内容复制到新的内存块,并释放原内存块,然后返回新内存块的指针。如果找不到合适的内存块,realloc会返回NULL。
- 程序可能面临的风险:
- 内存泄漏:如果realloc失败返回NULL,而原指针(arr)没有妥善处理,原分配的内存(10 * sizeof(int))将无法释放,从而导致内存泄漏。
- 悬空指针:如果继续使用arr指针(因为realloc失败返回NULL,但没有对arr进行处理,arr仍然指向原内存块,而原内存块可能已被系统回收),就会产生悬空指针,导致未定义行为,程序可能崩溃。
- 避免风险的方法:
- 在调用realloc后,检查返回值是否为NULL。如果返回NULL,说明内存分配失败,应保留原指针并根据需要释放原内存块。
- 若realloc失败,原arr指向的内存情况及处理:
- 若realloc失败,原arr指向的内存块不会被释放。应检查realloc的返回值,如下代码示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int *)malloc(10 * sizeof(int));
if (arr == NULL) {
perror("malloc");
return 1;
}
int *temp = (int *)realloc(arr, 20 * sizeof(int));
if (temp == NULL) {
// realloc失败,保留原arr,可根据需要释放原内存
printf("realloc failed, keep the original memory.\n");
// 这里可以选择释放原内存
free(arr);
arr = NULL;
} else {
arr = temp;
}
// 后续使用arr
if (arr!= NULL) {
// 使用arr
free(arr);
}
return 0;
}
在上述代码中,先使用malloc
分配内存,然后调用realloc
,如果realloc
失败,打印错误信息,并根据情况选择释放原内存并将arr
置为NULL
,避免内存泄漏和悬空指针问题。如果realloc
成功,将返回的新指针赋值给arr
,后续正常使用arr
并在使用完毕后释放内存。