MST

星途 面试题库

面试题:C语言中动态内存分配函数malloc使用不当导致的常见错误有哪些

在C语言中,简述使用malloc函数进行动态内存分配时,可能会出现哪些常见的动态内存错误,并举例说明如何避免这些错误。
39.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 常见动态内存错误
    • 未检查返回值malloc可能分配内存失败并返回NULL,若不检查直接使用返回指针会导致未定义行为。例如:
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(10 * sizeof(int));
    // 未检查ptr是否为NULL
    *ptr = 10; 
    free(ptr);
    return 0;
}
- **内存泄漏**:分配的内存使用完后未释放,导致内存浪费。比如:
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(10 * sizeof(int));
    // 程序结束时未释放ptr指向的内存
    return 0;
}
- **释放已释放的内存**:重复释放同一块内存会导致程序崩溃。示例:
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(10 * sizeof(int));
    free(ptr);
    // 再次释放ptr
    free(ptr); 
    return 0;
}
- **内存越界访问**:访问已分配内存块之外的区域,破坏其他数据或程序状态。如下:
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(5 * sizeof(int));
    // 访问超出分配范围的内存
    for(int i = 0; i < 10; i++) { 
        ptr[i] = i;
    }
    free(ptr);
    return 0;
}
  1. 避免错误的方法
    • 检查返回值:在使用malloc返回的指针前,检查是否为NULL
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(10 * sizeof(int));
    if(ptr == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }
    *ptr = 10; 
    free(ptr);
    return 0;
}
- **及时释放内存**:在内存使用完毕后,调用`free`函数释放。
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(10 * sizeof(int));
    if(ptr == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }
    // 使用ptr
    free(ptr); 
    return 0;
}
- **避免重复释放**:释放内存后将指针置为`NULL`,这样再次释放`NULL`指针是安全的。
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(10 * sizeof(int));
    if(ptr == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }
    free(ptr);
    ptr = NULL;
    // 再次free(ptr) 是安全的
    free(ptr); 
    return 0;
}
- **防止内存越界**:确保对内存的访问在已分配的范围内。
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(5 * sizeof(int));
    if(ptr == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }
    for(int i = 0; i < 5; i++) { 
        ptr[i] = i;
    }
    free(ptr);
    return 0;
}