c語言以內存分配筆記

先看一個數組:數組

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));
    }

}

打印結果:

相關文章
相關標籤/搜索