C语言(七)

目录

动态内存管理

动态内存开辟常见错误

1,对NULL指针的解引用操作

2,对动态开辟的空间做越界访问

3,使用free释放非动态开辟的空间

4,使用free释放动态开辟内存的一部分

5,对同一块动态内存开辟的空间,多次释放

6,动态开辟的空间忘记释放

其他

动态开辟的空间,两种回收方式:

内存动态管理经典笔试题

小题目:

C/C++程序分配的几个区域:

柔性数组

柔性数组的特点:

柔性数组的优势:


动态内存管理

概念

malloc的全称是memory allocation,也就是 是动态内存分配函数

首先来看函数原型

函数原型为  void *malloc(unsigned int size)  ;其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。

返回类型为 void *,该类型相当于一个通用型指针,最好在将返回的指针强制转换为需要的类型,这样可以提高可读性。 

然而,把void 的指针赋给任意类型的指针完全不用考虑类型匹配问题。

如果malloc()分配内存失败,将返回一个空指针。

动态内存开辟常见错误


1,对NULL指针的解引用操作

int main()
{
    int* p = (int*)malloc(100000000);
    对malloc()函数的返回值做判空处理
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        *(p + i) = i;
    }
    return 0;
}

2,对动态开辟的空间做越界访问


int main()
{
    int* p = (int*)malloc(10 * sizeof(int));
    int* p  = (int*)malloc(100000000000);
    if (p == NULL)
    {
        return 1;
    }
    int i = 0;
    for (i = 0; i < 40; i++)
    {
        *(p + 1) = i;
    }
    free(p);
    p = NULL;
    return 0;
}

3,使用free释放非动态开辟的空间

int main()
{
    int arr[10] = { 0 };
    int* p = arr;
    free(p);
    p = NULL;
    return 0;
}
这种静态开辟的空间,不能用free()释放

4,使用free释放动态开辟内存的一部分


int main()
{
    int* p = malloc(10 * sizeof(int));
    if (p == NULL)
    {
        return 1;
    }
    int i = 0;
    for (i = 0; i < 5; i++)
    {
        *p++ = i;
    }
    free(p);
    p = NULL;
    return 0;
}
不能中途释放;p指针在移动了之后,不能记住起始地址有内存泄露的风险

5,对同一块动态内存开辟的空间,多次释放


int main()
{
    int* p = (int*)malloc(100);
    使用;
    释放;
    free(p);
    p = NULL;//添加为空指针之后,释放就不会出问题了
    free(p);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值