MST

星途 面试题库

面试题:C语言动态内存分配中的内存地址管理与潜在问题

在C语言中,使用`malloc`动态分配了一块内存`int *ptr = (int *)malloc(10 * sizeof(int));`,之后对这块内存进行一系列操作,例如赋值等。假设在操作过程中需要重新分配内存大小为20个`int`,请使用`realloc`完成此操作,并详细说明可能会出现的内存地址相关问题及如何避免,如内存泄漏、悬空指针等情况在这个场景下是如何产生与预防的。
18.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 使用realloc重新分配内存
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(10 * sizeof(int));
    if (ptr == NULL) {
        perror("malloc");
        return 1;
    }

    // 对ptr指向的内存进行操作,例如赋值
    for (int i = 0; i < 10; i++) {
        ptr[i] = i;
    }

    // 使用realloc重新分配内存大小为20个int
    int *new_ptr = (int *)realloc(ptr, 20 * sizeof(int));
    if (new_ptr == NULL) {
        perror("realloc");
        free(ptr);
        return 1;
    }
    ptr = new_ptr;

    // 对新分配的内存部分进行操作,例如赋值
    for (int i = 10; i < 20; i++) {
        ptr[i] = i;
    }

    // 使用完后释放内存
    free(ptr);
    return 0;
}
  1. 可能出现的内存地址相关问题及预防
    • 内存泄漏
      • 产生原因:在使用realloc时,如果realloc失败(返回NULL),而我们没有释放原来malloc分配的内存ptr,就会导致内存泄漏。因为此时ptr指向的内存无法再被访问和释放。
      • 预防措施:如上述代码所示,在realloc失败时,及时调用free(ptr)释放原来分配的内存。
    • 悬空指针
      • 产生原因:如果在realloc成功后,忘记将ptr更新为realloc返回的新指针new_ptr,当free(ptr)被调用时,实际上释放的是旧的较小内存块,而之后如果继续使用ptr,就会导致悬空指针问题。因为ptr指向的内存已经被释放,而程序可能误以为它仍然指向有效的内存。
      • 预防措施:在realloc成功后,将ptr更新为realloc返回的新指针,即ptr = new_ptr;。这样后续对内存的操作和释放都是基于正确的指针。