非數(shù)組的指針
先看一個例子:
char *r;
strcpy(r,s);
strcpy(r,t);
程序的目的是將兩個字符串進行拼接并存在一個新的字符串里屋厘,但是這樣寫是不對的,因為在定義時沒有讓指針指向一個內(nèi)存空間瑞信。跟改方法可以使用char r[100]這樣給一個足夠大的空間卢鹦,或者使用malloc庫函數(shù)锻离。記得在malloc之后要及時釋放內(nèi)存空間。
作為參數(shù)的數(shù)組申明
看一個例子:
char hello[]="hello";
printf("%s\n",hello);
實際上是將數(shù)組的第一個元素地址傳給函數(shù)了槽棍。因此將數(shù)組作為函數(shù)參數(shù)毫無意義捉蚤。C語言會自動將作為參數(shù)的數(shù)組申明轉(zhuǎn)換為相應(yīng)的指針申明。注意在其他情況下不一定有這種轉(zhuǎn)換關(guān)系炼七。
連接器
如果一個變量出現(xiàn)在所有的函數(shù)體之外缆巧,那么他就被稱為外部變量的定義,如int a說明了a是一個外部整型變量特石,同時為a分配了存儲空間盅蝗,因為外部沒有指定初始值,所以它默認為0姆蘸。
extern int a顯式的說明了a的存儲空間是在程序的其他地方分配的墩莫。從連接器的角度這是對外部變量的引用而不是定義
一個避免定義沖突的好辦法是:每個外部變量只在一個地方聲明,這個聲明的地方一般就放在一個頭文件中逞敷,需要用到該外部對象的所有模塊都應(yīng)該包括這個文件狂秦。特別需要指出的是定義這個外部變量的模塊也應(yīng)該包括這個頭文件。
零散點
- 對于數(shù)組結(jié)尾之后的下一個元素推捐,取它的地址是合法的裂问,但是讀這個元素的值是未定義的。
- 無符號數(shù)沒有溢出牛柒,只有有符號數(shù)運算才會整數(shù)溢出堪簿,溢出時的結(jié)果是未定義的,所以任何邏輯判斷都不可靠皮壁。一種有效的方式是把有符號數(shù)轉(zhuǎn)為無符號數(shù)進行邊界判斷椭更。
- ?