




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C語(yǔ)言語(yǔ)義陷阱超詳細(xì)梳理總結(jié)malloc有可能無(wú)法提供請(qǐng)求的內(nèi)存,這種情況下malloc函數(shù)會(huì)通過(guò)返回一個(gè)空指針來(lái)作為“內(nèi)存分配失敗”事件的信號(hào)。
給r分配的內(nèi)存在使用完畢后應(yīng)該及時(shí)釋放。
前面的例程在調(diào)用malloc函數(shù)時(shí)并未分配足夠的內(nèi)存,因?yàn)樽址€包含結(jié)束標(biāo)志'\0'。
3作為參數(shù)的數(shù)組聲明
1.下面列舉的兩種寫法是等價(jià)的:
charhello[]="hello";
printf("%s\n",hello);//寫法1
printf("%s\n",hello);//寫法2
原因:數(shù)組名hello代表數(shù)組hello首元素的地址。
2.下面的兩種寫法是等價(jià)的:
intstrlen(chars[])
/*具體內(nèi)容*/
intstrlen(char*s)
/*具體內(nèi)容*/
}
注意下面的兩種寫法:
externchar*hello;
externcharhello[];
這兩種寫法雖然是都是正確的,但是不同的形式傳遞給我們的意思卻是完全不一致的,我們要根據(jù)具體情況進(jìn)行使用。
4空指針并非空字符串
注意:空指針不能對(duì)其進(jìn)行解引用。
同時(shí)注意不能出現(xiàn)下述寫法:
if(strcmp(p,(char*)0)==0)
···
這種寫法是非法的,原因在于庫(kù)函數(shù)strcmp的實(shí)現(xiàn)中會(huì)包括一個(gè)操作,用于查看它的指針參數(shù)所指向的內(nèi)容,即對(duì)空指針進(jìn)行了解引用。
也不能出現(xiàn)下述寫法:
假設(shè)p是空指針
printf(p);
printf("%s",p);
//當(dāng)然,這兩種寫法是等價(jià)的
這種行為是未定義的。
5邊界計(jì)算與不對(duì)稱邊界
在我們寫循環(huán)是最好這樣來(lái)寫:
inti=0;
for(i=0;ii++)
···
這樣寫能夠更好的看出循環(huán)的次數(shù),即10次。
當(dāng)數(shù)組中有10個(gè)元素時(shí),下標(biāo)的取值范圍為0到9,但是當(dāng)我們不需要引用這個(gè)元素時(shí)只需要引用這個(gè)元素的地址時(shí),我們可以這樣寫
intarr[10]={1,2,3,4,5,6,7,8,9,10};
for(inti=0;arr[i](arr[10]);i++)
···
這樣可以順利打印出數(shù)組元素從1到10的數(shù)字,
ANSIC標(biāo)準(zhǔn)明確允許這種用法:數(shù)組中實(shí)際不存在的"溢界"元素的地址位于數(shù)組之外所占內(nèi)存之后,這個(gè)地址可以用于進(jìn)行賦值和比較。當(dāng)然,如果要引用該元素,那就是非法的了。對(duì)于實(shí)際去讀取這個(gè)元素的值,這種做法的結(jié)果是未定義的,而且極少有編譯器能偶檢測(cè)出這個(gè)錯(cuò)誤。當(dāng)然,如果試圖去修改這個(gè)元素,必然會(huì)導(dǎo)致程序崩潰,屬于非法訪問(wèn)了!
6求值順序
C語(yǔ)言中只有四個(gè)運(yùn)算符(、||、:和,)存在規(guī)定的求值順序。==運(yùn)算符和運(yùn)算符||首先對(duì)左側(cè)操作數(shù)求值,只有在需要時(shí)才對(duì)右側(cè)操作數(shù)求值。==運(yùn)算符:有三個(gè)操作數(shù):在ab:c中。操作數(shù)a首先被求值,根據(jù)a的值再求操作數(shù)b或c的值(此時(shí)b或c兩個(gè)表達(dá)式根據(jù)前面a表達(dá)式的結(jié)果只會(huì)執(zhí)行一個(gè))。逗號(hào)運(yùn)算符則首先對(duì)左側(cè)操作數(shù)求值,然后"丟棄該值",再對(duì)右側(cè)操作數(shù)求值。
注意:分割函數(shù)的參數(shù)并非逗號(hào)運(yùn)算符。例如,x和y在函數(shù)f(x,y)中的求值順序是未定義的,而在函數(shù)g((x,y))中卻是確定的先x后y的循序。在后一個(gè)例子中,函數(shù)g只有一個(gè)參數(shù)。這個(gè)參數(shù)的值是這樣求得的:先對(duì)x求值,然后“丟棄”x的值,接著求y的值。
這種求值順序的存在使得某些“錯(cuò)誤”的程序變?yōu)榱苏_,且在執(zhí)行后得出正確的結(jié)果:
if(count!=0sum/countsmallaverage)
···
注意:C語(yǔ)言中其它所有的運(yùn)算符對(duì)其操作數(shù)求值的順序是未定義的。特別是,賦值運(yùn)算符并不保證任何求值循序。
例如:下面的這中從數(shù)組x中復(fù)制前n個(gè)元素到數(shù)組y中的做法是不正確的,因?yàn)樗鼘?duì)求值順序做了太多的假設(shè):
i=0;
while(in)
y[i]=x[i++];
上面的代碼假設(shè)y[i]的地址將在i的自增操作指向之前被求值,但這是不一定的,這依賴于編譯器的具體實(shí)現(xiàn)。同樣,下面的這種寫法也是不正確的:
i=0;
while(in)
y[i++]=x[i];
修改成下面這種寫法即可正常工作:
i=0;
while(in)
y[i]=x[i];
i++;
}
當(dāng)然,這種寫法也可以簡(jiǎn)寫為:
for(i=0;ii++)
y[i]=x[i];
7整數(shù)溢出
無(wú)符號(hào)整數(shù)不會(huì)發(fā)生溢出,這是C語(yǔ)言所規(guī)定的,如果結(jié)果大于所能表示的最大值M,則模(M+1),也就是發(fā)生了截?cái)喱F(xiàn)象。
兩個(gè)有符號(hào)整數(shù)進(jìn)行相加時(shí)會(huì)發(fā)生溢出,而且溢出的結(jié)果是未定義的。
下面是一種錯(cuò)誤的檢查方式:
if(a+b0)
complain();
因?yàn)楫?dāng)a+b卻是發(fā)生溢出時(shí),所有關(guān)于結(jié)果如何假設(shè)都不再可靠。
下面是兩種正確的方式:
//方法一:
if((unsigned)a+(unsigned)INT_MAX)
complain();
//方法二:
if(aINT_MAX-b)
complain()
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 暑期教師家訪工作總結(jié)模版
- 醫(yī)療領(lǐng)域中醫(yī)院感染控制的創(chuàng)新策略
- led屏幕施工合同范例
- 區(qū)塊鏈技術(shù)在智慧城市中的安全應(yīng)用建議
- 代理審計(jì)合同范例
- 醫(yī)院感染控制與醫(yī)療安全風(fēng)險(xiǎn)管理
- 模式識(shí)別II-考試題A-2024-答案
- 臨時(shí)護(hù)工合同范例
- 專利交易合同范例
- 人工智能在醫(yī)學(xué)教育中的角色及其道德和法規(guī)責(zé)任
- 2024年初級(jí)會(huì)計(jì)實(shí)務(wù)考試真題及答案(5套)
- 2024年高考化學(xué)真題完全解讀(廣東卷)
- 預(yù)防老年人癡呆
- 三年級(jí)信息科技第23課《分解描述問(wèn)題》教學(xué)設(shè)計(jì)、學(xué)習(xí)任務(wù)單及課后練習(xí)
- 數(shù)據(jù)庫(kù)應(yīng)用技術(shù)-第三次形考作業(yè)(第10章~第11章)-國(guó)開(kāi)-參考資料
- 設(shè)備調(diào)試工作流程
- 農(nóng)業(yè)水利工程基礎(chǔ)知識(shí)單選題100道及答案
- 2024江蘇南通醋酸纖維有限公司第二批次招聘33人筆試參考題庫(kù)附帶答案詳解
- 四川樂(lè)山歷年中考語(yǔ)文現(xiàn)代文閱讀真題37篇(截至2024年)
- 機(jī)器學(xué)習(xí)與非線性方程-深度研究
- 2023年小學(xué)科學(xué)實(shí)驗(yàn)知識(shí)競(jìng)賽試題庫(kù)含答案
評(píng)論
0/150
提交評(píng)論