C語言的動態分配記憶體

來源:互聯網
上載者:User

       我們為什麼要通過函數來實現動態分配記憶體呢?系統難道不是會自動分配記憶體嗎??


    既然有人會問這樣的問題,那麼我在這裡好好的講解一下吧!首先讓我們熟悉一下電腦的記憶體吧!


      在電腦的系統中有四個記憶體地區:

      1)棧:在棧裡面儲存一些我們定義的局部變數以及形參(形式參數);

      2)字元常量區:主要是儲存一些字元常量,比如:char *p_str=”cgat”;其中”cgat”就儲存在字元常量區裡面;

      3)全域區:在全域區裡儲存一些全域變數和靜態變數;

      4)堆:堆主要是通過動態分配的儲存空間,也就是我們接下需要講的動態分配記憶體空間。


       什麼時候我們需要動態分配記憶體空間呢?舉一個例子吧。int *p; 我們定義了一個指向int類型的指標p;p是用來儲存一個地址的值的,我們之所以要為p這個變數分配空間是讓它有一個明確的指向,打個比方吧!你現在做好了一個指向方向的路標,但是你並沒有讓這個路標指向一個確切的方位,也就是說現在的這個路標是瞎指向的,這樣我們就不能夠通過它來明確到底哪裡是東,哪裡是西,何為北,何為南了。雖然我們在電腦的記憶體裡定義了一個指標變數,但是我們並沒有讓這個變數指示一個確切int類型變數的地址,所以我們就必須要讓它有一個明確的指示方向。這樣我們就要通過動態分配記憶體的方式來認為的規定它的方向!


      我們在剛剛接觸指標的時候遇到過這樣的情況,int *p;p=&a;這種方法不是指標的動態分配記憶體,這個叫做指標變數的初始化!初始化同樣也可以讓指標變數有方向可指。int *p;p=malloc(n*sizeof(類型名稱));我們通過malloc()函數為一個指標變數p分配了地址,這樣我們從鍵盤上鍵入的值就這樣儲存在p裡面了,接下來我們就可以對這個p進行具體的操作了,比如scanf(“%s”,p)等等。


      當我們對p結束操作的時候還要釋放p的記憶體空間。為什麼要釋放記憶體空間呢?在上面我已經講過動態分配的變數時儲存在堆裡面,但是這個堆的空間並不是無限大的,也許當我們編一個小的程式的時候可能我們並不能夠發現什麼,但是對於那些大的程式,如果我們比及時釋放堆的空間的時候會放生記憶體泄露。所謂記憶體泄露是因為堆的空間北我們動態分配用完了,這樣當我們再去使用動態分配堆的空間的時候就沒有足夠的空間讓我們使用了,這樣就需要佔有原來的空間,也就是會把其他的空間來儲存我們鍵入的值,這樣會導致原來儲存的資料被破壞掉,導致了記憶體的泄露了。



     同時當我們使用malloc()函數的時候還應該注意當我們釋放完空間的時候還要將原先的指標變數賦予一個NULL,也就是賦予一個null 指標,留著下次的時候使用它!如果我們不賦予|NULL行不行呢??答案是:不行的!如果我們不賦予一個null 指標這樣會導致原先的指標變數成為了一個野指標!何謂野指標?野指標就是一個沒有明確指向的指標,系統不知道它會指向什麼地方,野指標是很危險的,因此當我們每次使用完malloc()函數的時候都必須將指標賦予一個null 指標!相對於malloc()函數,calloc()函數就不需要我們賦予NULL了,這是因為在每次調用完calloc()函數的時候系統會自動將原先的指標賦予一個null 指標,即歸於“0”。calloc()函數的原型是void
*calloc(count,sizeof(類型名稱));比如:p=(char*)calloc(4,sizeof(char));我們為p分配了指向char型指標的“4”個空間。


      除了malloc()與calloc(),還有一個動態分配空間的函數realloc()函數,這個函數比前兩個函數分配更多的空間,原型:void *realloc(void *p,size_t size);該函數有幾個作用:1) 如果有足夠的空間來擴充p的記憶體塊,則返回一個指向p的指標;2) 如果沒有足夠的空間來擴充p的記憶體塊,則為p從新分配size的空間,並把原來的內容複寫給p,指向p的開頭,同時釋放原來的空間,返回一個指向新記憶體塊的指標;3)
如果p=NULL,其作用於malloc()相似;下面舉一個程式的例子:

#define LONG 10#include<string.h>#include<stdlib.h>#include<stdio.h>main(){   char *message,buf[LONG];   gets(buf);   message=(char*)realloc(NULL,strlen(buf)+1);   strcpy(message,buf);   puts(message);   gets(buf);   message=(char*)realloc(message,(strlen(message)+strlen(buf)+1));   strcat(message,buf);   puts(message);   return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.