《c語言深度剖析》學習筆記4

2021-06-07 06:55:54 字數 1661 閱讀 7820

第五章 記憶體管理

5.1 野指標

> 定義指標變數的同時,最好初始化為null,用完指標之後,也將指標變數的值設定為null.

5.2 棧、堆和靜態區

>靜態區:儲存自動全域性變數和static變數。靜態區的內容在整個程式的生命週期內都存在,有編譯器編譯時分配。

>棧:儲存區域性變數。棧上的內容只在函式的範圍內存在,當函式執行結束的時候,這些內容也自動被銷毀。其特點是效率高,但空間大小有限。

>堆:由malloc系列函式或new操作符分配的記憶體。其生命週期由free或delete決定。其特點是使用靈活,空間比較大,但容易出錯。

5.3 常見的記憶體錯誤

>指標沒有指向一塊合法的記憶體:

>>1.

struct student

stu,*pstu;

int main()

為指標變數pstu分配了記憶體,但是沒有給pstu的成員name分配記憶體!

>>2.    assert巨集在除錯時的使用。

>>3.    在定義變數的時候,盡可能地去初始化。

>>4.    記憶體越界:int a[3]; a[3] = 4;

>>5.    記憶體洩露:會產生記憶體洩露的記憶體就是堆上的記憶體,即由malloc / new分配的記憶體。如果用完之後沒有即使free/delete,這快記憶體就無法釋放,直到整個程式終止。

>>6.    malloc函式

函式原型:(void *)malloc(int size);

函式返回的是void *型,所以必須將其轉換成你所接收的型別。

char *p = (char *)malloc(100);在堆上分配了100個位元組記憶體,返回這塊記憶體的首位址,並強制轉換成char *型後賦值給p。這塊記憶體本身沒有名字,對它的訪問只能通過p來匿名訪問。

如果所申請的記憶體塊大於目前堆上剩餘的記憶體塊,則記憶體分配失敗,返回null。需要用if(null != p)來驗證。

char *p = (char *) malloc(0); 可以申請0位元組的記憶體,但p != null;  (p 怎樣使用呢?)  

#include #include int main()

>>7.    free函式

free函式,斬斷指標變數和這塊記憶體的關係。因為malloc函式分配的記憶體塊都要通過p來訪問,free就是把他們倆的關係斬斷。

free後,指標變數p儲存的位址沒有改變,但它對這塊位址處的記憶體已經沒有所有權了。這塊被釋放的記憶體裡面儲存的指也沒有變,只是再沒有辦法訪問它了。(????)free完之後,如果沒有把p指向null,p就成為了野指標。

>>對null指標的free是什麼情況?

第六章 函式

6.1 函式宣告的時候,可以省略引數的名字,但定義的時候不能省略。

6.3 getchar()函式的原型:int getchar(void);

6.4 不用全域性變數/區域性變數編寫strlen函式:

int my_strlen(const char *strdest)

else

}第七章 檔案結構

~

C語言深度剖析學習筆記 符號

1.預處理時,編譯器會使用空格替換,所以 in t i 0 是錯誤的,gcc e 編譯後變成 in t i 0 2.y x p 不等於 y x p,因為編譯器解析語法的時候,是從左到右,找最長的有意義的單元,對於第二段 編譯器找到x後繼續往後找,判斷 x 是否是合法的識別符號或者關鍵字,發現不是,於...

《C語言深度剖析》筆記

c語言深度剖析 筆記 1.在c語言中,凡不加返回值型別限定的函式,就會被編譯器作為返 回整形處理。2.register 變數必須是乙個單個的值,並且其長度應小於或等於整型 的長度。而且 register 變數可能不存放在記憶體中,所以不能用取 址運算子 來獲取 register變數的位址。3.int...

C語言深度剖析筆記

1.變數定義 所謂的定義就是 編譯器 建立乙個物件,為這個物件分配一塊記憶體並給它取上乙個名字,這個名字就是我們經常所說的變數名或物件名。2.變數宣告 1.告訴編譯器,這個名字已經匹配到一塊記憶體上了,下面的 用到變數或物件是在別的地方定義的。宣告可以出現多次。2.告訴編譯器,這個名字已被預訂了,別...