MST

星途 面试题库

面试题:C语言realloc函数的内存管理陷阱

在使用realloc函数时,如果当前内存块后续空间不足,realloc通常会怎么做?请详细描述在这种情况下,程序可能面临的风险以及如何避免。假设程序中有如下代码:int *arr = (int *)malloc(10 * sizeof(int)); arr = (int *)realloc(arr, 20 * sizeof(int)); 若realloc失败,原arr指向的内存会怎样?应如何处理?
20.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. realloc在当前内存块后续空间不足时的做法
    • realloc通常会在堆内存中寻找一块大小为新请求大小(这里是20 * sizeof(int))的连续内存块。如果找到合适的内存块,它会将原内存块的内容复制到新的内存块,并释放原内存块,然后返回新内存块的指针。如果找不到合适的内存块,realloc会返回NULL。
  2. 程序可能面临的风险
    • 内存泄漏:如果realloc失败返回NULL,而原指针(arr)没有妥善处理,原分配的内存(10 * sizeof(int))将无法释放,从而导致内存泄漏。
    • 悬空指针:如果继续使用arr指针(因为realloc失败返回NULL,但没有对arr进行处理,arr仍然指向原内存块,而原内存块可能已被系统回收),就会产生悬空指针,导致未定义行为,程序可能崩溃。
  3. 避免风险的方法
    • 在调用realloc后,检查返回值是否为NULL。如果返回NULL,说明内存分配失败,应保留原指针并根据需要释放原内存块。
  4. 若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并在使用完毕后释放内存。