為什麼說C/C++是不安全的呢?因為他們都直接在記憶體上操作,稍有不慎就會漏洞百出,不論是數組越界還是記憶體洩漏都是一些極為棘手的問題,稍微短小的代碼還好排錯,要是幾萬行的代碼怎麼處理?是以資源管理不管是C還是C++都極為重要,要做一個合格的程式員,就要能夠管理記憶體資源。說到記憶體管理,今天不得不說的兩個函數就是上次我們說到的malloc()和free()了。
-----------------------------------
double * ptr;
ptr = (double*)malloc(50*sizeof(double));
-------------------------------------
這段代碼請求 30 個 double 類型值的空間, 并且把 ptr 指向該空間的所在位置。
注意 ptr 是作為指向一個 double 類型值的指針聲明的,而不是指向 50個 double 類型值的資料塊的指針。
記住: 數組的名字是它第一個元素的位址, 是以,如果我們令 ptr指向一個記憶體塊的第一個元素,就可以像使用數組名一樣使用它。也就是說,可以使用表達式 ptd[0] 來通路記憶體塊的第一個元素,ptd[1] 來通路第二個元素, 依此類推。正如前面所學,可以在指針符号中使用數組名,也可以在數組符号中使用指針。
說到這裡,我們好像發現聲明一個數組的方式似乎有兩種了,哪兩種呢?我們現在來理一理:
1. 聲明一個數組,聲明時用常量表達式指定數組維數,然後可以用數組名通路數組元素。
2. 聲明一個指針, 調用 malloc(),然後使用該指針來通路數組元素。
用第二種方式,既是用malloc可以做一些用普通的數組聲明做不到的事:建立一個動态數組 (dynamicarray),即一個在程式運作時才配置設定記憶體并可在程式運作時選擇大小的數組. 例如, 假定 n 是一個整數變量. 在 C99 之前, 不能這樣做:
double array[n];
如果 n 是一個變量, c99 之前不允許這樣做,就算是現在的VS2012也不支援這麼寫,不過GCC支援。
然而, 即使在 c99 之前的編譯器中,如果想要申請一個變量數組,我們可以這樣做:
ptr = (double *) malloc (n * sizeof(double));
是不是發現這種方式很有用嗎?動态建立的好處是對資源的利用,下面是一個更為普通的使用方法:
T* ptr;
ptr = (T*)malloc(sizeof(T)*n);
T表示類型,在malloc面前的這個T可有可無,在C裡面是這樣的,不過在C++裡就必須要有,是以為了和C++相容,我們還是把他帶上。
當然,在結束使用之後,記得使用free()将資源釋放。free()參數就是要釋放的記憶體,如果我們使用完ptr後,我們就用free将他釋放掉:free(ptr)即可。
malloc的參數就是我們想要的記憶體大小,為了不至于記憶體洩漏,為了不至于數組越界,是以我們就得更好的利用這個函數去動态配置設定記憶體。
和malloc一樣,calloc也是動态配置設定記憶體的函數,該函數和malloc的用法有些不一樣,如果我們用calloc來修改上面的定義就得這樣寫了:
----------------------------------
double* ptr;
ptr = (double*)calloc(50,sizeof(double));
其中端倪就留給大家去探索了,calloc同樣可以用free來釋放記憶體。
關于C/C++的五種儲存類型就留待大家去探索吧,我就不打算說了。明天我們說文本檔案的操作吧。