只針對額強大很大成都上源於它能追蹤動態分配的記憶體。通過指標來管理這部分記憶體是很多操作的基礎,包括一些用來處理複雜資料結構的操作。要完全利用這些能力,需要理解c的動態記憶體管理怎麼回事。
c程式在執行時環境中執行,這通常是有作業系統提供的環境,支援堆和棧以及其他的程式行為。
注意 c99引入了變長陣列,即陣列的大小不是在編譯時確定而是在執行時確定。不過陣列一旦建立出來其長度就不會改變了。迷途指標是乙個常見的問題,我們通過事例說明什麼情況下會出現迷途指標並介紹解決迷途指標的方法。指標使用不當可能會早場很多不可預期的效果,可能會產生無效效果,損壞資料或者終止資料。
在c語言中動態記憶體分配的步驟:
用malloc類的函式分配記憶體
用這些記憶體支援應用程式
用free函式釋放記憶體(釋放結束最好將指標置為null)
事例程式:
int *pi = (int*)malloc(sizeof(int));
*pi = 5;
printf("pi:%d", *pi);
free(pi);
pi = null;
注意上述使用sizeof(int)指定malloc分配記憶體的大小可以提高程式的相容性。因為不同平台上int所佔的位元組數不同
每次呼叫malloc,程式結束時必須呼叫對應的free函式,以防止記憶體洩露。一般對指標進行釋放記憶體之後將其設定為null,防止程式再次對其進行訪問出錯。注意給字串進行分配記憶體的時候特別注意要多分配乙個位元組裝結束符』\0』(c語言字串的結尾預設以』\0』結尾).
//此處pc最多只能裝長度為5的字串
char* pc = (char*)malloc(6);
//此處列印的是指標pc在記憶體中的長度,與malloc多少位元組無關,64機器此處結果為8
*pc = "12345";
printf("%zu\n", sizeof(pc));
//此時輸出的是字串的長度,結果為5
printf("%zu\n", strlen(pc));
如果不再使用已經分配的記憶體卻沒有將其釋放就會發生記憶體洩露,導致記憶體洩露的情況有一下兩種:
下面一種情況可以導致記憶體丟失,即乙個指標被連續兩次分配記憶體:
int * pi = (int*)malloc(sizeof(int));
*pi = 5
……pi = (int*)malloc(sizeof(int));
下圖說明了兩次分配記憶體的情況,其中500處的記憶體發生丟失。
每次迭代name會增加1,最後name會指向字串結尾的nul,分配的起始位址就丟失了
如果程式在應該釋放記憶體而實際卻沒有釋放,也會發生記憶體洩露,如果我們不再需要某個物件但仍然儲存在堆上,就會發生隱式的記憶體洩露。這種隱式洩露的帶來的主要問題是物件在使用的記憶體其實不需要了,應該歸還給堆,最壞的情況時堆管理器無法按需分配記憶體,導致程式不得不終止。
另一種容易發生記憶體洩露的情況是struct中含有指向動態分配的記憶體的指標,那麼在釋放結構體之前一定要先釋放這些指標
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
深入理解C指標
指標使用分析 提及指標早已不再感覺到陌生,大一初識c語言,老師就一再強調指標的重要性。而然一直以來對其的認識僅停留在 指標 指向其他資料的記憶體位置的變數 現在我們不妨以指標如何用開始,再次 指標。先來看一段 include using namespace std intmain 宣告乙個int型指...