MST
星途 面试题库

面试题:C语言在Linux环境下内存管理基础

在Linux C编程中,常见的动态内存分配函数有哪些?它们在使用时需要注意什么,比如如何避免内存泄漏?请举例说明。
47.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

常见动态内存分配函数

  1. malloc
    • 函数原型:void *malloc(size_t size);
    • 功能:分配指定字节数的内存空间。返回一个指向分配内存起始地址的指针,如果分配失败则返回NULL
  2. calloc
    • 函数原型:void *calloc(size_t nmemb, size_t size);
    • 功能:分配nmemb个长度为size字节的连续内存空间,并将所有字节初始化为0。返回一个指向分配内存起始地址的指针,如果分配失败则返回NULL
  3. realloc
    • 函数原型:void *realloc(void *ptr, size_t size);
    • 功能:重新分配ptr所指向的内存块的大小为size字节。如果ptrNULL,则相当于调用malloc(size);如果size0,且ptr不为NULL,则相当于调用free(ptr)并返回NULL。返回一个指向重新分配内存起始地址的指针,如果分配失败则返回NULL

使用时注意事项及避免内存泄漏方法

  1. 检查返回值:每次调用动态内存分配函数后,都要检查返回值是否为NULL,以判断分配是否成功。如果返回NULL,应采取适当的错误处理措施,如输出错误信息并终止程序。
  2. 释放内存:使用完动态分配的内存后,必须调用free函数释放内存,以避免内存泄漏。free函数的原型为void free(void *ptr);,其中ptr必须是之前通过malloccallocrealloc分配得到的指针。
  3. 避免多次释放:确保不要对同一个指针多次调用free函数,这会导致未定义行为。可以在调用free后将指针设置为NULL,以防止意外再次释放。
  4. 匹配内存分配和释放:对于每一个动态内存分配函数(malloccallocrealloc),都要有对应的free调用,并且要保证释放的指针是正确的。

示例代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 使用malloc分配内存
    int *ptr1 = (int *)malloc(5 * sizeof(int));
    if (ptr1 == NULL) {
        perror("malloc");
        return 1;
    }
    // 使用calloc分配内存
    int *ptr2 = (int *)calloc(5, sizeof(int));
    if (ptr2 == NULL) {
        perror("calloc");
        free(ptr1);
        return 1;
    }
    // 使用realloc调整内存大小
    int *ptr3 = (int *)realloc(ptr1, 10 * sizeof(int));
    if (ptr3 == NULL) {
        perror("realloc");
        free(ptr1);
        free(ptr2);
        return 1;
    }
    ptr1 = ptr3; // 更新指针

    // 使用完后释放内存
    free(ptr1);
    free(ptr2);

    return 0;
}

在上述代码中,通过malloccallocrealloc分配内存,并在使用后正确释放内存,避免了内存泄漏。同时,在每次分配内存后检查返回值,以确保内存分配成功。