c语言中动态内存管理
温馨提示:这篇文章已超过412天没有更新,请注意相关的内容是否还可用!
说到内存,大家一定都知道。但是有一种函数可以实现动态内存管理,下面大家一起学习。
文章目录
- 一、为什么要有动态内存管理?
- 二、malloc 和 free
- 1.malloc
- 2.free
- 三、calloc 和 realloc
- 1.calloc
- 2.realloc
- 3.常见的动态内存的错误
- 3.1对NULL指针的解引用错误
- 3.2对动态开辟空间的越界访问
- 3.3对非动态开普内存使用free释放
- 3.4 使用free释放一块动态开辟内存的一部分。
- 3.5 对同一块动态内存多次释放。
- 3.5 动态开辟内存忘记释放(内存泄漏)
- 4.经典笔试题分析
- 4.1
- 4.2
- 4.3
- 4.4
- 四、柔性数组
- 1.柔性数组的特点
- 2.柔性数组的使用
一、为什么要有动态内存管理?
经过c语言的学习,相信大家都知道如何开辟一块内存。
int i = 6; int arr[10]={0};上面代码开辟的空间,有两个特点:
- 空间开辟大小是固定的。
- 数组在申明的时候必须指定数组的长度,数组空间一旦确定大小就不能调整了。
这时候我们会发现当我们写代码的时候,我们需要开辟多少空间在程序运行的时候才能知道。这时候就需要引入动态内存开辟了,让程序员自己申请和释放空间。
二、malloc 和 free
1.malloc
void* malloc (size_t size);
这个函数向内存申请一开连续可用的空间,并返回指向这块空间的指针。
- 如果开辟成功,则返回一个指向开辟好空间的指针。
- 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
- 返回值的类型是void*,所有malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
- 如果参数size为0,malloc的行为是标准的未定义,取决于编译器。
这个代码用了malloc函数申请空间,先是申请了20个字节的空间强制转换为整形变为存放5个整数。
2.free
void free (void* ptr);
函数free,是专门用来给动态内存的释放和回收的。
- 如果参数ptr指向的空间不是动态开辟的,那么free函数的行为毫无意义。
- 如果参数ptr是NULL指针,则函数什么事都不做。
#include #include int main() { int num = 0; scanf("%d", &num); int arr[num] = {0}; int* ptr = NULL; ptr = (int*)malloc(num*sizeof(int)); if(NULL != ptr)//判断ptr指针是否为空 { int i = 0; for(i=0; i *(ptr+i) = 0; } } free(ptr);/释放ptr所指向的动态内存 ptr = NULL;//是否有必要? return 0; } int *p = (int *)malloc(INT_MAX/4); *p = 20; free(p); } int i = 0; int *p (int*)malloc(10*sizeof(int)); if(NULL == p) { exit(EXIT_FAILURE); } for(i=0; i *(p+i) = i; } free(p); } int a =10; int* p=&a; free(p); } int *p = (int *)malloc(100); p++; } free(p); int *p = (int *)malloc(100); free(p); free(p);//重复释放 } int *p = (int *)malloc(100); if(NULL != p) { *p = 20; } } int main() { test(); while(1); } p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } char p[] = "hello world"; return p; } void Test(void) { char *str = NULL; str = GetMemory(); printf(str); } *p = (char *)malloc(num); } void Test(void) { char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); } char *str = (char *) malloc(100); strcpy(str, "hello"); free(str); if(str != NULL) { strcpy(str, "world"); printf(str); } } int i; int a[];//柔性数组成员 }; int n;//4 int arr[]; }; int main() { struct S* ps = (struct S*)malloc(sizeof(struct S) + 5*sizeof(int)); if (ps == NULL) { perror("malloc"); return 1; } ps-n = 100; int i = 0; for (i = 0; i到这里动态内存管理基本就结束了,大家如果有问题可以一起讨论。谢谢大家!
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

