没有学不会的义务之动态内存管理
为什么要有动态内存管理让程序员自己可以申请和释放空间数组等开辟空间的大小是固定的内存中的不同区malloc函数功能向内存的堆区申请一块连续可用的空间并返回指向这块空间的起始地址。1.如果开辟成功则返回这块空间的起始地址2.如果开辟失败则返回一个NULL指针因此malloc的返回值一定要做检查3.返回值的类型是void*所以malloc函数并不知道开辟空间的类型具体在使用的时候使用者自己做决定申请了一块地方但不知道申请的额这块地方是放什么的所以返回这块空间的起始地址4.如果参数size为0malloc的行为标准是未定义的取决于编译器放0无意义需要的头文件stdlib.hreturn 1表示malloc开辟失败程序非正常结束如果是正常结束应该执行return0free的使用格式free是用来释放动态开辟的内存free释放了空间但是指针的值仍在这是指针就变成了野指针非常危险所以需要手动将指针pNULL(变长数组不能初始化)calloc函数也用来动态内存分配函数的功能是为num个大小为size的元素开辟一块空间并且把空间的每个字节初始化为0与函数malloc的区别在于calloc会在返回地址之前把申请的空间的每个字节初始化为全0realloc函数realloc函数的出现让动态内存管理变得更加灵活realloc函数可以做到对动态开辟内存大小的调整ptr是要调整的内存的地址size是调整之后的新大小单位是字节返回值为调整之后内存的地址若原来的空间后的位置已被分配位置不够则开辟新的一块空间并且将旧的空间里的数据重新拷贝一份到新的空间中返回新的空间的起始地址释放掉旧的地址反之则直接扩大原来空间后的位置并不发生移动realloc函数也可以直接用来申请空间等价于malloc常见的动态内存的错误1.对NULL的解引用因为malloc函数会开辟失败若不判断是否开辟成功就会出现问题。2.对动态内存空间的越界访问实际用的空间大于malloc申请的空间。3.对非动态开辟内存使用free如对数组进行free操作.4.使用free释放动态开辟内存的一部分free释放空间的时候一定要给这块空间的起始位置5.对同一块动态内存多次释放free了一块空间在并没有给这块空间置为空的时候再次free6.动态开辟内存忘记释放谁申请的空间谁释放不使用的空间及时释放自己函数1不方便释放的空间要告诉别人函数2释放题目分析例题1崩溃原因1.str传递给Getmemory时使用的是值传递形参变量p其实是str的一份拷贝当我们把malloc申请的空间的起始地址存放在p中时不会修改strstr依然为空指针。所以当Getmemory函数返回后再去调用strcpy函数需要将“hello world”拷贝到str指向的空间时程序崩溃2.因为malloc申请的空间没有free释放存在内存泄漏例题2结果为随机值原因数组p为局部变量存放在栈区出了作用域就销毁了也就意味着str不可以使用它即使地址被传过去了。返回栈空间的地址当找这个地址时它却被销毁了。修改这道题的方法在char p【】前加上static因为static修饰之后将数组存放在内存的静态区柔性数组c99中结构中的最后一个元素允许是未知大小的数组这就叫做柔性数组的成员这样写有时候会报错可以改成a【】柔性数组的特点1.结构体中的柔性数组成员前面必须至少有一个其他成员2.sizeof返回的这种结构大小不包括柔性数组的内存3.包含柔性数组的结构用malloc函数进行内存的动态分配并且分配的内存应该大于结构体的大小以适应柔性数组的预期大小
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2415775.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!