品牌展示设计网站,优质专业建设申报网站,合肥做网站哪家好,广告公司简介介绍引言#xff1a;随着大一期末的到来#xff0c;想必许多学生都学到内存的动态管理这一部分了#xff0c;看望这篇博客后#xff0c;希望能解除你心中对这一章节的疑惑。
(・∀・(・∀・(・∀・*) 1.malloc详解
malloc的头文件是#include sdtlib.h,malloc - C Ref…
引言随着大一期末的到来想必许多学生都学到内存的动态管理这一部分了看望这篇博客后希望能解除你心中对这一章节的疑惑。
(・∀・(・∀・(・∀・*) 1.malloc详解
malloc的头文件是#include sdtlib.h,malloc - C Reference (cplusplus.com)
我们可以点进看看的malloc的详细内容 可以看到malloc返回值是void*类型也就是说明在使用时我们还需要根据需要开辟空间的类型强制类型转换成自己所要的类型。例如我们要开辟40个字节的空间代码如下。
#include stdlib.h
int main()
{int* pa (int *) malloc(10 * sizeof(int));return 0;
}
用数组的来写如下
同样也可以实现空间的开辟这里我们就来谈谈相同点与不同点。
#include stdio.h
int main()
{int pa[10];return 0;
}
相同点
向内存申请一块空间在程序结束时释放
不同点
申请的内存位置不同malloc在堆区数组在栈区。头文件不同malloc头文件是stdlib.h数组头文件是stdio.h空间动态性malloc所申请的空间是可变的动态的可以通过使用realloc(下面会再讲解realloc的用法)来改变大小数组所申请的空间是不可变的定义完后就固定了。数组定义时可以初始化空间内容malloc申请空间时不能初始化内容且其空间里的内容是随机值。malloc申请空间可能失败数组不会。
如何理解这些不同点以及如何配套使用malloc我们看下面这一段代码
#include stdlib.h
int main()
{int* pa (int *)malloc(10 * sizeof(int));if (pa NULL){perror(malloc:);return 1;}int i 0;for (i 0; i 10; i){*(pai) i;printf(%d , *(pai));}free(pa);pa NULL;return 0;
}我们可以看到用malloc申请完空间后我们接着写了一段代码判断pa是否为NULL 我们接上不同点5malloc申请空间可能会失败。所以我们要分类讨论malloc申请空间的情况
1.失败返回NULL空指针。
2.成功返回申请到空间的首地址。
至于perror是一种打印申请空间失败原因的库函数我们可写可不写为了可读性最好加上接着如果失败我们return 1结束程序。因为以及申请失败了下面的代码是针对成功的情况如果不结束程序代码就会出错。 for循环将0到9输入到这片空间中并打印到屏幕中
最后使用完了这块空间我们free释放掉(free是编译器里的库函数用来释放某一块空间的还回去。释放完后free函数并不会将pa置为NULL为了防止野指针的出现我们需要手动设为NULL. 2.calloc详解
calloc和malloc很类似也是申请一块空间我们接着看。
calloc的头文件是#include sdtlib.hcalloc - C Reference (cplusplus.com)
我们可以点进看看的calloc的详细内容 同样我们可以看到calloc的返回值是void*但calloc函数比malloc多了一个参数。我们具体分析 具体了解calloc。我们比较calloc与malloc
相同点
1.都是向堆区申请一块空间。
2.都是动态的可变的。
3.成功返回这块空间的首地址失败返回NULL。
4.函数返回值都是void*。
不同点
1.申请的空间成功时可以初始化为0而malloc不可以。
至于不同点我们看代码
#include stdlib.h
int main()
{int* pa (int *)calloc(10 , sizeof(int));if (pa NULL){perror(calloc:);return 1;}int i 0;for (i 0; i 10; i){printf(%d , *(pai));}free(pa);pa NULL;return 0;
} 我们没有给calloc申请的空间赋值我们看结果是 申请空间后初始化为0。
3.realloc详解
realloc的头文件是#include sdtlib.hrealloc - C Reference (cplusplus.com)
我们可以点进看看的calloc的详细内容 看功能realloc是来调整malloc/calooc申请的空间。与数组的不同就体现在这。
具体分析realloc的两个参数 具体我们看代码操作
#include stdlib.h
int main()
{int* pa (int*)malloc(5 * sizeof(int));if (pa NULL){perror(mallco:);return -1;}for (int i 0; i 5; i){*(pa i) i;//pa需要i指向下一个位置。printf(%d , *(pa i));}int* pb (int*)realloc(pa, 10 * sizeof(int));if (pb NULL){pb pa;free(pb);pb NULL;perror(realloc:);return 1;}elsepa pb;for (int i 5; i 10; i){*(pa i) i;//pa需要i指向下一个位置。printf(%d , *(pa i));}free(pa);pa NULL;return 0;
}
代码上半部分用malloc申请一块空间后我们觉得20字节大小不够我们就使用realloc函数增大空间至40个字节大小。同样申请完后我们要判断申请是否成功。 这里realloc比较复杂。我们一一述说 1.失败返回NULL。
2.成功有分为两种情况
在申请时太大占用了其它已经占用空间时realloc会在内存的堆区重新找一个满足条件的空间同时把旧的数据copy到新的空间接着释放旧空间同时返回新空间的起始地址。在申请时空间够用时返回起始地址。
所以如果pbNULL时申请失败我们需要把之前malloc申请的空间释放掉。并置为NULL。
总结malloc,calloc,realloc三者都是void*类型函数接收返回值时都要强制类型转换。在堆上申请的空间要即使释放并置为空指针。每次申请完后要判断申请是否成功等等。
以上希望能够帮到你让你对动态内存管理有跟深的理解。