C语言,不得不重视的内存分配

存储区的划分:

 (1)栈区:栈区存储局部变量,栈区的内存是由系统自动管理,系统开辟,系统回收,无需程序员管理.

 (2)堆区:通过堆区内存分配函数,分配的空间都在堆区,堆区的最大特点:堆区的空间需要程序员手动管理,手动开辟,手动释放.(OC常用)

 (3)常量区:对于字符常量,整型常量,浮点型常量,字符串常量统一存储在该区,该区的内存由系统自动管理,特点:常量去的内容不能修改

 (4)静态区,全局区:存储全局变量,以及静态变量.内存由系统管理但是在程序的运行期间空间都不会释放

 (5)代码区:编译之后形成的CPU指令存储在该区

 概念:

     局部变量:在函数内部定义的变量,数组.(栈区)

     全局变量:在函数外部定义的变量,数组.(全局区)

     静态变量:static修饰的变量.(静态区)

栈区内存的错误使用方式

栈区的内存地址不能作为函数的返回值

原因(season):栈区的内存在函数执行完毕之后空间已经被系统回收,不能再访问

解决方案:让空间在函数执行完毕之后系统不回收空间即可,定义成全局变量,或者静态变量.或者在堆区开辟空间


1.野指针错误

产生原因:访问不该访问(已经没有使用权,空间已经释放还给系统)的内存

解决方案:释放内存的所有权的同时,将地址也清除掉.

 p = NULL;//指向无效的空间

2.过度释放

产生原因:对一块内存释放(free)多次

解决方案:保证只释放(free)一次,将其他的释放操作删除掉.(过度释放会立即crash)

3.内存泄漏

产生原因:分配了内存,使用完之后,没有释放掉,造成内存堆积,最后会因为没有内存可分配,而造成程序crash

解决方案:内存使用完之后立即释放掉


/其他内存分配函数

calloc(n, size)  分配n,size大小的空间

calloc  malloc相比,calloc分配完空间之后,将数据清除,空间清零

整形数组大小的空间,5个元素

int *p = calloc(5, 4);// 分配20个字节(连续), 分配完之后对分配空间清零,也就是申请的内存空间会初始化成  0

realloc(地址, newSize),给定一个地址,从该地址开始按新的内存空间大小重新分配.

 /*

malloc(<#size_t#>)

realloc(<#void *#>, <#size_t#>)

calloc(<#size_t#>, <#size_t#>)

都是用在堆区

*/

   

内存操作函数 , 既可以用于堆内存也可以用于栈内存

    /**

    void *memset(void *s, int c, size_t n); 可以用在栈区,也可以用在堆区

    s开始,长度为n的所有字节赋值为c

    通常用于清除结构体或者数组数据.

    例如

    Student *p = calloc(5, sizeof(Student));

    memset(p, 0, sizeof(Student));

    void *q = malloc(100);

    memset(q, 0, 100);//清零操作,

     */

    /**

     *void *memcpy(void *dest, const void *source, size_t n);

     source拷贝n个字节到dest

     例如:

    Student *p = malloc(sizeof(Student));

    strcpy(p->name, "zhangsan");

    p->age = 20;

    Student *q =malloc(sizeof(Student));

    memcpy(q, p, sizeof(Student));

     */

    /**

     *  int memcmp(const void *buf1,const void *buf2, unsigned int count);

     内存比较结果分为 >0  <0  =0

     const void *buf1  const void *buf2  两个比较体  每个字节每个字节相比

     unsigned int count比较次数

     */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值