C中的動態內存分配問題:
格式:Int *pointer;
Pointer = (int *)malloc(100 * sizeof(int));
可以在被調用函數(該函數返回指針的函數)中動態分配內存,(並且該內存是分配在堆內存中的,故而被調函數可以返回指向該堆內存的指針),然后返回該指針值,該指針指向動態分配的內存,然后可以在主函數中free掉pointer。哪怕在主函數中將該指針值賦值給pointer_2,free掉pointer_2也是可以的,(可以理解的,它們都指向該堆內存),以避免出現內存泄漏。
對二維數組的動態內存分配與釋放,我們知道在C++中直接int *pointer = new int[3][4]; 然后delete []pointer即可,C++可以直接對二維數組進行動態內存分配與釋放。但是在C中,要么動態內存分配pointer= (int *)malloc(12 * sizeof(int)),也即直接分配一塊連續的內存存放12個數組元素,而后free一次pointer;要么分配3塊連續的動態內存分別存放4的數組元素,而后free三次pointer。后者需要用到指針數組來存放3個動態內存指針:int *pointer[3];注意與指向一位數組的指針區別:int (*pointer)[3].
第二種方法是挺復雜的。涉及到指針數組的動態內存分配問題。二重指針通常與指針數組一同使用,也即定義一個二重指針指向指針數組,可以理解的。兩種方法范例源代碼見下篇。
二重指針與指針數組的使用也是一定要注意的,還不熟練。
int **pointer; int *pointer_array[4]; //指針數組要對數組元素賦值,也即對數組里面的指針元素賦地址值,而非對指針元素指向的整型數據賦數值,otherwise編譯出錯 pointer = pointer_array; //指針數組的數組名仍然代表地址
ATTENTION:
/** pointer = pointer_array + 1 //這是合法的,pointer + 1 代表了數組pointer_array中第二個指針元素的地址 pointer= pointer_array[1] //這是非法的,pointer_array[1]代表了數組pointer_array中的第2個元素,也即數組中盛放的第二個指針,
我們是想把第二個指針的地址賦給pointer,而不是把第二個指針賦給pointer,會報錯:error: cannot convert 'int*' to 'int**' in assignment pointer_array[1]僅僅是指針,而pointer是指針的指針。 **/
上一段源碼:
#include <stdio.h> int main() { int **pointer; int *p[3]; int a = 1; int b = 2; int c = 3; p[0] = &a; p[1] = &b; p[2] = &c; pointer = p; //pointer = p[0]; ///好好研究此處啊,它和上一行是不同的!!!看看error!! printf ("%d\n", *(*(pointer + 2))); return 0; }
如果要設計一個被調函數,該函數返回一個指向指針類型的指針,比如返回一個指針數組的地址,也就是返回一個二重指針,它的定義形式如下:
Int **allocation(parameter_1, parameter_2, ...)