malloc數組
void *malloc(size_t size)
內存地址
NULL
#include<stdio.h> #include<stdlib.h> #define LEN 3 int main(void) { //定義指向堆空間指針 int* p = (int*)malloc(LEN*sizeof(int)); if(NULL==p) { printf("內存申請失敗\n"); return -1; } //類數組方式賦值 for(int i=0;i<LEN;i++) { printf("輸入:"); scanf("%d",p+i); } //遍歷 for(int i=0;i<LEN;i++) { printf("%d\t",*(p+i)); } //換行 printf("\n"); //釋放內存 if(NULL!=p) { free(p); p = NULL; } return 0; }
總結指針
malloc
申請的內存在申請已後如同數組同樣暫時性
不可變,同時申請的內存是連續內存
因此能夠如同
數組同樣經過下標
訪問到元素
,同時用malloc
申請的內存空間系統不會進行初始化操做,內部處於隨機狀態calloccode
void *calloc(size_t nitems, size_t size)
內存地址
NULL
#include<stdio.h> #include<stdlib.h> int main(void) { printf("須要多個個?:"); int n;//個數 scanf("%d",&n);//用戶輸入個數 int* p = (int*)calloc(n,sizeof(int));//申請對應個數的內存 if(NULL==p)//申請失敗的問題 { printf("內存申請失敗\n"); return -1; } for(int i=0;i<n;i++)//循環輸入 { printf("輸入:"); scanf("%d",p+i);//相似數組 } for(int i=0;i<n;i++)//循環輸出 { printf("%d\t",*(p+i)); } printf("\n"); if(NULL!=p)//釋放空間 { free(p); p=NULL; } return 0; }
總結內存
calloc
具備申請空間後自動初始化的能力,官方描述中也是如此,malloc
是申請空間後不初始化,而傳參數方面,二者幾乎同樣,malloc
的參數
是總字節
數,而calloc
則分開成個數
與單個字節
數realloc原型
void *realloc(void *ptr, size_t size)
內存地址
NULL
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) { char* str=(char*)calloc(8,sizeof(char));//申請堆區內存 strcpy(str,"abcdefg"); printf("從新分配以前第四位字符:%c\n",*(str+3)); printf("從新分配以前:%d個佔位\n",(int)strlen(str)); str = (char*)realloc(str,((int)sizeof(str)+2)*sizeof(char)); printf("從新分配以後:%d個佔位\n",(int)strlen(str)); if(NULL!=str) { free(str); str = NULL; } return 0; }
總結string
realloc
只能從新分配從malloc
calloc
申請到的內存空間,若是分配其它空間絕逼報錯不解釋,最易出錯的在於malloc
是直接申請一塊內存,只須要傳入你的需求量,而且不會幫你初始化,而calloc
一樣是直接申請一塊內存但會初始化,傳值是個數和單個類型的字節,而realloc
是起到一個從新分配的做用,它的參數須要的是一個目標指針,和分配後這個目標指針的總大小,就比如原先的內存佔用是2個字節的,如今須要+3個字節,哪麼你的總需求量則是5個字節佔位,而不是3