與堆操作相關的兩個函數
malloc
#include<stdio.h> #include<stdlib.h> #include<string.h>int main() {char *p = malloc(10); //內存隨機,未做處理int i;for(i = 0; i < 10: i++){printf(“%d “,p[i]);} free(p);return 0; }
運行結果:(linux)
exbot@ubuntu:~/wangqinghe/C/20190630$ ./malloc
0 0 0 0 0 0 0 0 0 0
全是0表示分配的這塊內存沒有用過。
相同的代碼在windows環境下運行必須將
char *p = malloc(10);換成 char *p = (char*)malloc(10);
因為malloc分配的地址是指向void*
不更換過來會報 invalid conversion from ‘void*’ to ‘char*’ 的錯誤
?
換過后的運行結果如下:
可以在使用malloc之后使用memset函數來初始化該指針指向的地址大小為0或者-1.(memset)只能初始化這兩種值。
?
char *p = malloc(10);
memset(p,0,10);???? //初始化所有內存為0
calloc
calloc函數可以直接達成這樣的效果:分配內存并且同時初始化為0
#include<stdio.h> #include<stdlib.h> #include<string.h>int main() {//char *p = malloc(10);char *p = (char*)calloc(10,sizeof(char));int i;for(i = 0; i < 10; i++){printf("%d ",p[i]);}free(p);return 0; }
?
realloc
想要將兩個分配的內存塊在一起,可以使用realloc函數
在原有內存基礎之上,在堆中間增加連續的內存。
如果原有內存沒有連續內存可擴展,那么會重新分配一個空間,將原有的內存copy到新空間,然后釋放。
#include<stdio.h> #include<stdlib.h> #include<string.h>int main() {char *p1 = (char*)calloc(10,sizeof(char));char *p2 = (char*)realloc(p1,10);int i;for(i = 0; i < 20; i++){printf("%d ",p2[i]);}free(p2);return 0; }
在p1內存的基礎上擴充,并且會自動初始化p1內存大小的內存為0;
若p2內存分配大小大于p1,那么多出來的內存則會有隨機值。
?
char *p2 = (char*)realloc(NULL,10)? //等同于malloc;
?
realloc和malloc只分配內存,不處理。