1. 程式人生 > >很容易弄混淆的知識點

很容易弄混淆的知識點

1.簡述Makefile的作用
makefile關係到了整個工程的編譯規則。一個工程中的原始檔不計數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作,因為makefile就像一個Shell指令碼一樣,其中也可以執行作業系統的命令。
makefile帶來的好處就是–“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率

2.sizeof與strlen的區別:
1. strlen 是函式,sizeof 是運算子。
2. strlen 測量的是字元的實際長度,以’\0’ 結束。而sizeof 測量的是字元的分配大小
3.但是在子函式中,ziseof 會把從主函式中傳進來的字元陣列當作是指標來處理。指標的大小又是由機器來決定,而不是人為的來決定的。
4.我們知道字元陣列的初始化一次性賦值,也可以逐個賦值。可以指定陣列的大小,也可以不指定陣列長度
5.strlen的結果要在執行的時候才能計算出來,是用來計算字串的長度,不是型別佔記憶體的大小。而大部分編譯程式在編譯的時候就把sizeof計算過了是型別或是變數的長度。
6.sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以”\0”結尾的。

3.什麼是野指標?如何避免野指標。
野指標:指向記憶體被釋放的記憶體或者沒有訪問許可權的記憶體的指標。
如何避免野指標:
一、對指標進行初始化
①將指標初始化為NULL。
②用malloc分配記憶體
③用已有合法的可訪問的記憶體地址對指標初始化
二、指標用完後釋放記憶體,將指標賦NULL。

4.c語言分配記憶體的方式有哪些?
c語言中常見的記憶體錯誤有哪些?
一般來說有以下三種:
(1)從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數等等。
(2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。
(3)從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。這種方式可能引起的問題是比較多的。
1、記憶體分配未成功,卻使用了它
2、記憶體分配雖然成功,但是尚未初始化就引用它。
3、記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界。
4.忘記了釋放記憶體,造成記憶體洩露。
5、釋放了記憶體卻繼續使用它。

5.Static全域性變數與普通變數的區別?static全域性變數只初使化一次,防止在其他檔案單元中被引用;
Static區域性變數與普通區域性變數的區別?static區域性變數只被初始化一次,下一次依據上一次結果值;
static函式與普通函式的區別?static函式在記憶體中只有一份,普通函式在每個被呼叫中維持一份拷貝

6.#include <> 和 #include “” 有什麼區別?

include< file >編譯程式會先到標準函式庫中找檔案

include”file” 編譯程式會先從當前目錄中找檔案

7.char *const p; char const *p; const char *p 三者的區別。
第一個和第三個是一樣的, p都是指向const char型別的指標, 不可以賦值給*p, 就是不可通過這個指標改變它指向的值.
第二個: char * const p是指向char的常指標, 指標需在宣告時就初始化, 之後不可以改變它的指向.

8.寫一個 巨集MIN,這個巨集輸入兩個引數並返回較小的一個。
另外,當你寫下面程式碼時會發生什麼事? least = MIN(*p++,b);

define MIN(a,b) ((a) <= (b)? (a) : (b))

指標p會作兩次++自增操作