一、內存分配函數
1、void * malloc(參數(需要分配的內存空間的大小));
void * malloc(參數1(元素所佔用空間大小) * 參數2(元素個數));不會進行清零操作
2、void * calloc (參數1(元素個數), 參數2(每個元素所佔用空間大小));
會進行清零操作
3、void * realloc(參數1(需要再次分配內存空間的指針),參數2(需要再次分配內存大小,可以寫成“sizeof(元素類型)* 元素個數”);
會將之前分配的內存釋放掉,重新分配後把原來內存空間的值拷貝到新地址如果直接把新分配的地址覆蓋原來的地址是有風險的,一旦內存分配失敗,原來的值就丟失了;爲了防止分配失敗導致原來的內容丟失,可以申明一箇中間變量來保存新地址,分配成功後再將新地址賦給舊地址;例如:int *p = malloc(sizeof(int) * 5); //分配5個sizeof(int)大小的地址int *Newp = realloc(p, sizeof(int) * 5); //在p的基礎上再分配5個sizeof(int)大小的地址,並賦值給p1if(p != NULL); //判斷內存是否分配成功p = Newp; //p已經在上一步被realloc函數釋放,將p1的值賦給p
4、釋放內存
free(p);
5、防止野指針問題:
p = NULL;
二、函數的指針
1、函數保存在代碼區,用指針存儲函數在代碼區的首地址,通過指針偏移對函數進行訪問,函數名就是函數的指針名,也是函數的首地址名;
2、函數的指針可以用作參數,那麼函數也可以用作參數。傳入函數指針的參數類型和它的返回類型一致;
三、指針函數
返回類型爲指針的函數;
四、void *
1、指向任何類型的指針,malloc分配對內存時,由於無法確定內存的存儲類型,所以可以使用void *代表任意類型的指針。
2、不能直接對void *指針進行*運算,在進行*運算之前要先進行強制類型轉換(type *)p;
3、void *能進行加減操作,但是是以字節爲單位進行運算,在運算之前最好先轉換成目標類型。