先看一個數組:數組
short array[5] = {1,2} // 這兒定義的一個int類型的數組,數組第1和第2個元素值是1和2.其他後面默認會給值爲0;函數
或者 short array[] = {1,2};//這兒數組第1和第2個元素,數組大小隻有2個。指針
數組名array實際上是指向的數組的首地址,好比咱們能夠經過array[1]取出數組的第二個元素,也能夠經過指針*(array+1)指向第二個元素取出對應的值。code
看完上面數組定義,能夠看出數組是必須固定大小的,並且不能夠再擴展的特性。blog
假設一個場景,咱們想要往一段內存裏寫入一堆的int類型的數據,可是大小是不知道的。若是使用數組這兒就不適用了。內存
還好咱們c語言有個函數malloc 和 calloc和realloc函數。可使用好比:擴展
short* array請求
array = (short*)malloc( sizeof(int)*30);im
//這兒首先開闢了30個int類型的空間,而後把p指向這個空間的位置。在這裏的指針是指向第一個int值。並非咱們所有開闢的30個int的空間。這就和數組同樣,指向數組的指針式指向數組首元素的地址,並非整個數組的元素。因此,在這裏咱們的操做也和數組是同樣的。call
若是咱們要實現動態內存拓展的方式,咱們可使用calloc和realloc。
接下來,咱們在認識兩個關於內存分配的函數。calloc()函數和realloc()函數。
calloc()函數與malloc()函數有相同之處,也有類似之處。
例:
short *p; newmem=(short *)calloc(1000,sizeof(short));
經過這個例子,咱們能夠知道calloc()函數有兩個參數,而且這兩個函數都是size_t類型(unsigned int類型)的數。第一個參數在這裏所說的是所須要開闢的內存的單元數量,第二個參數是每一個單元的字節的大小。
void *calloc(size_t ,size_t);
calloc()函數還有一個特性,它將塊中的所有位都置爲0。這也是calloc()函數和malloc()函數的區別,calloc()函數和malloc()函數的另一個區別是他們請求內存數量的方式不同。固然,free()函數也能夠來釋放calloc()函數分配的內存。
realloc()函數用來修改一個原先已經分配的內存的大小。使用這個函數,你可讓一塊內存增大仍是縮小。當擴大時,這塊內存原先的內容會依然保留,新增長的添加到原先的後面。縮小時,該內存的尾部部份內存去掉,剩餘保留。
注意:對於realloc()函數,若是原先的內存沒法修改,這時候realloc()函數再會分配一塊內存,而且把原先那塊內存的內容複製到上面去。因此,使用了realloc函數之後,你這時候在使用的就該是realloc函數返回的新指針了。當realloc函數的第一個參數是NULL時,這時候咱們能夠把它看成是malloc()函數。
咱們來個例子:
void printChars(){
int *strs = malloc(sizeof(int)* 255); //使用動態分配內存 建立int類型返回數組
for (int i = 0; i < 255; i++){
*(strs+i ) = i + 1;
}
int M = 100; //動態大小
int *p;
p = (int*)malloc(sizeof(int)*M);
int N = 1;
for (int i = 0; i < 255; i++){
if (i % 100 == 0 && i!=0){ //達到極限的時候,再次動態擴充整數倍布內存
p = realloc(p, sizeof(int)*M*(++N));
}
*(p + i) = *(strs+i);
}
for (int j = 0; j < 255; j++){
printf("%d " , *(p + j));
}
}
打印結果: