第11課 記憶體、標頭檔和資料結構 - 2011.10.30
對於C語言,記憶體配置是非常重要的,這涉及到程式的穩定性和安全性。假設有在stack中儲存username和pw這樣安全敏感的資料,有風險,因為函數返回時,這些內容並沒有真正消失,如果是我們自己的程式,確保只有我們自己的代碼訪問記憶體沒有問題,但是如果是合作性的或者是庫方式,有buffer overflow exploit的隱患。例如,通過memcpy覆蓋函數的返回地址(存放在stack),可以跳到hacker代碼的入口。因此我們要注意檢測資料的邊界,不允許越界處理,另外這類資料可採用heap的存放方式,自主控制分配和釋放(stack的是由系統自動進行)。此外我們要避免將某些敏感數值,例如pw寫死,作為initialized
data,相對位址和數值固定不變,存在風險,可以通過gdb或者某些方式來擷取。在java,不會出現這種情況,所有記憶體配置和釋放都是系統進行。
有一個以前沒用過的空間分配函數 realloc(),就是重新分配的意思,可以用了擴大記憶體大小,而不影響原有的資料。realloc實際調用malloc,並將原來的內容memcopy過來,free原來的內容。
接著介紹了標頭檔,自訂資料類型和檔案讀寫。
第12課 記憶體,檔案存放,鏈表 -2011.10.31
sscanf,文法和printf相似,但是不是寫,而是從中讀取。例如sscanf(line," %d %c",&n,&c);則根據格式,將line的相應內容讀入n和c中,返回讀取的內容,如果line="123",則只能讀取%d到n,1個資料,返回1,如果line"123X",則讀取兩個資料,返回2。scanf是從keyborad中讀取,同理。
介紹數組。數組預先限定大小,允許分配某個固定值,都可能產生越界。採用realloc可以解決,但是效率較低。接著介紹單鏈表。
typedef struct node{
int n;
struct node * next;
}t_node;
檔案存放採用類似的方式,通過增加block來增加儲存空間。利用此,我們可以擷取或猜測已刪除檔案的的地址,並進行恢複。例如加入一個檔案,可以從檔案讀取前前面地址存放的資料。具體和disk檔案架構相關。
介紹單鏈表的增、刪處理。
相關連結:我的與編程思想相關的文章