作者:劉旭暉 colorant@163.com轉載請註明出處 http://blog.csdn.net/colorant/
================================================
malloc 和 calloc
calloc會把分配出來的記憶體中的每一個位元組都初始化為0, 這可以保證不僅是將分配給結構對象的記憶體都初
始化為0,包括成員之間的Padding也是0
此外,個人覺得用Calloc的好處在於他能保證你分配出來的記憶體確實可用。因為malloc實際上只是預留出一
部分記憶體位址,在真正使用之前並不真正分配記憶體。 這可能導致你可以成功的分配很大的記憶體,結果發現
最後使用的時候OOM Out of Memory了。 有篇很好的文章詳細的分析了這一問題:
http://www.linuxdevcenter.com/pub/a/linux/2006/11/30/linux-out-of-memory.html
================================================
fopen時的訪問模式 r 和 w
很少在應用程式層編程,一直以為r就是讀,w就是寫,不能混用。 原來這不是最根本的區別,r+ 和 w+ 就是讀
寫都可以的。最更本的區別在於,如果一個檔案不存在,r會失敗,w會建立。如果一個檔案已經存在 r模式
開啟,w模式會開啟並truncate(清空)
================================================
#include 標頭檔的嵌套層數限制
書上說是16層,也就是說一個標頭檔包含另一個標頭檔,不斷的包含最多可以有16層的深度。
覺得少了一點,試了一下,用遞迴嵌套 1.h 包含2.h 2.h包含1.h
x86 上 gcc4.1.2 出錯提示 #include nested too deeply 的時候,嵌套了198層,這個。。。真的足夠用
了。
================================================
printf輸出格式中,可以用變數來指定欄位寬度,在位寬描述符的地方使用*,對應變數位置即可:
char str[]="hello , guys";
int width = 20;
printf("%*s/n",width,str);
================================================
GCC:
想要得到GCC預先處理一個檔案的結果(插入標頭檔,展開宏),可以使用 -E 參數:
GCC -E -o file.i file.c
-C 參數可以保留源檔案中的注釋
用GCC輸出組合語言代碼時,可以使用 -fverbose-asm 將C語言中的變數名作為組合語言的注釋。
逐行對比查看GCC如何把C語言翻譯成彙編代碼,這個應該挺有用:
gcc -g -o file.o -Wa,-a=file.asm,-L file.c
================================================
Makefile 中 = := ?= 的區別:
= 遞迴展開,變數會原封不動的儲存字元序列,知道被引用的時候再展開。
:= 簡單展開,在變數賦值的時候就展開,後續修改對它賦值時引用的變數不影響它的值。
?= 如果變數原先沒有賦值,則遞迴展開,否則不變。 這個應該比較常出現在判斷變數是否已經在環境變數中被定義的情況。
如下Makefile
STR = "INIT"
STR2 = "INIT"
STR3 = "INIT"
NAME = "First"
STR = $(NAME)
STR2 := $(NAME)
STR3 ?= $(NAME)
STR4 ?= $(NAME)
NAME = "Second"
ALL:
@echo $(STR)
@echo $(STR2)
@echo $(STR3)
@echo $(STR4)
Make的輸出結果是:
Second
First
INIT
Second
================================================