?? 編程修養(yǎng)(三).txt
字號(hào):
6、if 語(yǔ)句對(duì)出錯(cuò)的處理
———————————
我看見你說(shuō)了,這有什么好說(shuō)的。還是先看一段程序代碼吧。
if ( ch >= '0' && ch <= '9' ){
/* 正常處理代碼 */
}else{
/* 輸出錯(cuò)誤信息 */
printf("error ......\n");
return ( FALSE );
}
這種結(jié)構(gòu)很不好,特別是如果“正常處理代碼”很長(zhǎng)時(shí),對(duì)于這種情況,最好不要用else
。先判斷錯(cuò)誤,如:
if ( ch < '0' || ch > '9' ){
/* 輸出錯(cuò)誤信息 */
printf("error ......\n");
return ( FALSE );
}
/* 正常處理代碼 */
......
這樣的結(jié)構(gòu),不是很清楚嗎?突出了錯(cuò)誤的條件,讓別人在使用你的函數(shù)的時(shí)候,第一眼
就能看到不合法的條件,于是就會(huì)更下意識(shí)的避免。
7、頭文件中的#ifndef
——————————
千萬(wàn)不要忽略了頭件的中的#ifndef,這是一個(gè)很關(guān)鍵的東西。比如你有兩個(gè)C文件,這兩
個(gè)C文件都include了同一個(gè)頭文件。而編譯時(shí),這兩個(gè)C文件要一同編譯成一個(gè)可運(yùn)行文件
,于是問題來(lái)了,大量的聲明沖突。
還是把頭文件的內(nèi)容都放在#ifndef和#endif中吧。不管你的頭文件會(huì)不會(huì)被多個(gè)文件引用
管你的頭文件會(huì)不會(huì)被多個(gè)文件引用
,你都要加上這個(gè)。一般格式是這樣的:
#ifndef <標(biāo)識(shí)>
#define <標(biāo)識(shí)>
......
......
#endif
<標(biāo)識(shí)>在理論上來(lái)說(shuō)可以是自由命名的,但每個(gè)頭文件的這個(gè)“標(biāo)識(shí)”都應(yīng)該是唯一的。
標(biāo)識(shí)的命名規(guī)則一般是頭文件名全大寫,前后加下劃線,并把文件名中的“.”也變成下劃
線,如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif
(BTW:預(yù)編譯有多很有用的功能。你會(huì)用預(yù)編譯嗎?)
(BTW:預(yù)編譯有多很有用的功能。你會(huì)用預(yù)編譯嗎?)
8、在堆上分配內(nèi)存
—————————
可能許多人對(duì)內(nèi)存分配上的“棧 stack”和“堆 heap”還不是很明白。包括一些科班出身
的人也不明白這兩個(gè)概念。我不想過(guò)多的說(shuō)這兩個(gè)東西。簡(jiǎn)單的來(lái)講,stack上分配的內(nèi)存
系統(tǒng)自動(dòng)釋放,heap上分配的內(nèi)存,系統(tǒng)不釋放,哪怕程序退出,那一塊內(nèi)存還是在那里
。stack一般是靜態(tài)分配內(nèi)存,heap上一般是動(dòng)態(tài)分配內(nèi)存。
由malloc系統(tǒng)函數(shù)分配的內(nèi)存就是從堆上分配內(nèi)存。從堆上分配的內(nèi)存一定要自己釋放。
用free釋放,不然就是術(shù)語(yǔ)——“內(nèi)存泄露”(或是“內(nèi)存漏洞”)—— Memory Leak。
于是,系統(tǒng)的可分配內(nèi)存會(huì)隨malloc越來(lái)越少,直到系統(tǒng)崩潰。還是來(lái)看看“棧內(nèi)存”和
“堆內(nèi)存”的差別吧。
棧內(nèi)存分配
—————
char*
AllocStrFromStack()
{
char pstr[100];
return pstr;
}
堆內(nèi)存分配
—————
char*
AllocStrFromHeap(int len)
{
char *pstr;
if ( len <= 0 ) return NULL;
return ( char* ) malloc( len );
}
對(duì)于第一個(gè)函數(shù),那塊pstr的內(nèi)存在函數(shù)返回時(shí)就被系統(tǒng)釋放了。于是所返回的char*什么
也沒有。而對(duì)于第二個(gè)函數(shù),是從堆上分配內(nèi)存,所以哪怕是程序退出時(shí),也不釋放,所
以第二個(gè)函數(shù)的返回的內(nèi)存沒有問題,可以被使用。但一定要調(diào)用free釋放,不然就是Mem
ory Leak!
在堆上分配內(nèi)存很容易造成內(nèi)存泄漏,這是C/C++的最大的“克星”,如果你的程序要穩(wěn)定
,那么就不要出現(xiàn)Memory Leak。所以,我還是要在這里千叮嚀萬(wàn)囑付,在使用malloc系統(tǒng)
蛑齦叮
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -