MST

星途 面试题库

面试题:C语言中使用malloc和free管理结构体池内存的常见错误

在C语言中,使用malloc分配结构体池内存并通过free释放时,可能会出现哪些常见错误?请举例说明并阐述如何避免。
16.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

常见错误及举例

  1. 内存泄漏
    • 举例
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int data;
} MyStruct;

int main() {
    MyStruct* structPool = (MyStruct*)malloc(10 * sizeof(MyStruct));
    if (structPool == NULL) {
        perror("malloc");
        return 1;
    }
    // 这里没有调用free(structPool)
    return 0;
}
- **原因**:分配了内存但未释放,导致这块内存一直被占用,直到程序结束。
- **避免方法**:在程序结束前,确保调用`free(structPool)`释放分配的内存。

2. 双重释放 - 举例

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

typedef struct {
    int data;
} MyStruct;

int main() {
    MyStruct* structPool = (MyStruct*)malloc(10 * sizeof(MyStruct));
    if (structPool == NULL) {
        perror("malloc");
        return 1;
    }
    free(structPool);
    free(structPool); // 双重释放
    return 0;
}
- **原因**:对已经释放的内存再次调用`free`函数,这会导致未定义行为。
- **避免方法**:释放内存后,将指针设置为`NULL`,如`free(structPool); structPool = NULL;`,这样再次尝试释放时,`free(NULL)`是安全的操作,不会引发错误。

3. 释放未分配的内存 - 举例

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

typedef struct {
    int data;
} MyStruct;

int main() {
    MyStruct* structPool;
    free(structPool); // 释放未分配的内存
    return 0;
}
- **原因**:试图释放一个没有通过`malloc`(或类似内存分配函数)分配的指针,同样会导致未定义行为。
- **避免方法**:在使用指针前,确保它已经通过合法的内存分配函数进行了分配。

4. 内存分配失败未处理 - 举例

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

typedef struct {
    int data;
} MyStruct;

int main() {
    MyStruct* structPool = (MyStruct*)malloc(10 * sizeof(MyStruct));
    // 没有检查malloc是否分配成功就继续使用structPool
    structPool[0].data = 10;
    return 0;
}
- **原因**:`malloc`可能由于系统内存不足等原因分配失败并返回`NULL`,如果不检查就继续使用,会导致程序崩溃。
- **避免方法**:在调用`malloc`后立即检查返回值,如:
MyStruct* structPool = (MyStruct*)malloc(10 * sizeof(MyStruct));
if (structPool == NULL) {
    perror("malloc");
    return 1;
}