C语言内存分配管理常见bug

简介: 标准C库提供了4个内存管理函数:malloc、calloc、realloc和free。bug1调用free释放p指向的内存块之后,p就是一个悬挂指针——指向逻辑上不存在的内存的指针。

标准C库提供了4个内存管理函数:malloc、calloc、realloc和free。

bug1

调用free释放p指向的内存块之后,p就是一个悬挂指针——指向逻辑上不存在的内存的指针。如果引用这个悬挂指针,会导致不可预见的错误。

ElemType* p = (ElemType*)malloc(sizeof(ElemType) * NUM);
...
free(p);// p = NULL;
...
*p = "...";

bug2

释放空闲内存,破坏内存管理函数所用的数据结构。

ElemType* p = (ElemType*)malloc(sizeof(ElemType) * NUM);
...
free(p);
...
free(p);

bug3

释放并非malloc、calloc或realloc分配的内存。

ElemType buf[20], *p;
if(n >= sizeof(buf){
    p = (ElemType*)malloc(sizeof(ElemType) * NUM);
}else{
    p = buf;
}
...
free(p);

bug4

1、没有考虑内存分配不成功的情况。如果分配失败应返回NULL;
2、使用后没有释放内存,多次调用会导致内存泄漏;

void itoa(int n, char *buf, int size){
    char *p = malloc(43);

    sprintf(p, "%d", n);
    if(strlen(p) >= size-1){//如果数字个数大于size-1时,用*填充。
        while(--size > 0){
            *buf++ = '*';
        }
        *buf = '\0';
    }else{
        strcpy(buf, p);
    }
}

初学者更容易犯下面的错误。itoa试图返回buf的内容,但itoa返回后,buf已经被清空了。

char *itoa(int n){
    char buf[43];

    sprintf(buf, "%d", n);
    return buf;
}

Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《C语言内存分配管理常见bug》: http://blog.csdn.net/u014134180/article/details/78335307

Wu_Being 吴兵博客接受赞助费二维码

如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。

目录
相关文章
|
1天前
|
存储 程序员 C语言
C语言(15)----动态内存讲解
C语言(15)----动态内存讲解
9 1
|
1天前
|
C语言
C语言(11)----内存函数
C语言(11)----内存函数
5 1
|
1天前
|
存储 测试技术 C语言
C语言内存管理函数研究
C语言内存管理函数研究
|
2天前
|
存储 编译器 C语言
玩转C语言——C语言中内存存储
玩转C语言——C语言中内存存储
10 0
|
2天前
|
程序员 编译器 C语言
C语言——动态内存管理
C语言——动态内存管理
5 0
|
2天前
|
C语言
C语言内存操作函数
C语言内存操作函数
8 1
|
5天前
|
存储 程序员 编译器
C语言变量声明内存分配(转载)
C语言变量声明内存分配(转载)
11 0
|
5天前
|
存储 安全 编译器
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)
11 0
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)
TU^
|
6天前
|
存储 C语言
C语言浮点数在内存中的存储
在C语言中,浮点数类型用float和double表示。float类型使用4个字节(32位),而double类型使用8个字节(64位)。浮点数表示的范围:float.h中定义
TU^
12 0
TU^
|
6天前
|
C语言
C语言内存函数和字符串函数模拟实现
C语言内存函数和字符串函数模拟实现
TU^
19 0