iOS開發學習筆記 2-9 C語言部分 內存分配函數 函數指針 指針函數 void*

一、內存分配函數

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)大小的地址,並賦值給p1
if(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 *能進行加減操作,但是是以字節爲單位進行運算,在運算之前最好先轉換成目標類型。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章