freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c語言實(shí)習(xí)程序-資料下載頁

2024-11-15 12:03本頁面
  

【正文】 rintf(“Input 10 numbers:”)。for(i=0。iscanf(“%d”,p++)。p=a。sort(p,10)。for(。pfprintf(fp,“%d ”,*p)。}system(“pause”)。fclose(fp)。}第五篇:C語言程序穩(wěn)定性提高C語言程序運(yùn)行穩(wěn)定性的方法一、前言由于C語言的靈活性,用C語言開發(fā)出來的程序容易造成內(nèi)存泄漏、運(yùn)行異常、運(yùn)行結(jié)果不可預(yù)期等程序質(zhì)量問題,在用C語言開發(fā)程序的過程中,必須高度重視程序質(zhì)量問題,應(yīng)當(dāng)把提高程序穩(wěn)定性的方法加入到項(xiàng)目管理和開發(fā)過程中,最大限度地提高程序的穩(wěn)定性,保證項(xiàng)目的成功開發(fā)。在這里總結(jié)多年來的C語言開發(fā)經(jīng)驗(yàn),拿出來共享以期在這方面能夠得到更多的指教。二、影響程序穩(wěn)定性的因素內(nèi)存泄漏。造成內(nèi)存泄漏的原因有:1)、程序有多個(gè)出口,但不能保證在每一個(gè)出口能夠完全釋放掉所有的動(dòng)態(tài)內(nèi)存,如函數(shù)內(nèi)有多個(gè)“return”,但沒有在每一個(gè)“return”前釋放掉在原已申請(qǐng)但必須釋放的動(dòng)態(tài)內(nèi)存;2)、對(duì)于“struct”數(shù)據(jù)結(jié)構(gòu),沒有完全釋放掉每一個(gè)指向動(dòng)態(tài)內(nèi)存的指針,如只釋放指向“struct”數(shù)據(jù)結(jié)構(gòu)指針沒有釋放“struct”體內(nèi)的指針或某些指針被漏釋放;3)、對(duì)于用動(dòng)態(tài)內(nèi)存建立的鏈表在釋放時(shí)沒有一個(gè)一個(gè)結(jié)點(diǎn)去釋放; 4)、一段動(dòng)態(tài)內(nèi)存空間原來只被一個(gè)指針引用,但在這個(gè)指針引用另外一段內(nèi)存空間的時(shí)候,該段內(nèi)存沒有被釋放;5)、對(duì)于在函數(shù)內(nèi)申請(qǐng)但必須在函數(shù)外釋放的動(dòng)態(tài)內(nèi)存,在對(duì)該內(nèi)存使用后忽略該動(dòng)態(tài)內(nèi)存的釋放;6)、用戶強(qiáng)行退出程序,程序在退出前不能完全釋放掉所有的動(dòng)態(tài)內(nèi)存; 7)、程序運(yùn)行過程中發(fā)生了異常導(dǎo)致動(dòng)態(tài)內(nèi)存未被釋放。程序運(yùn)行發(fā)生異常。造成異常產(chǎn)生的原因有:1)、釋放指針時(shí)該指針為空或是一個(gè)已被釋放但釋放后未被置空的指針;2)、對(duì)于C庫中的函數(shù),如字符串操作函數(shù),在調(diào)用該類函數(shù)時(shí)實(shí)參為空指針或者改指針沒有指向可用的內(nèi)存地址空間或者所指向的內(nèi)存空間大小不足以用來實(shí)現(xiàn)當(dāng)前的字符串操作;3)、對(duì)于指向一個(gè)“struct”數(shù)據(jù)結(jié)構(gòu)的指針,當(dāng)指針為空時(shí)使用“struct”的分體數(shù)據(jù);4)、數(shù)組或指針發(fā)生越界操作;5)、指針指向一個(gè)已被釋放但釋放后未被置空的指針,如一個(gè)全局變量的指針,在一個(gè)地方被釋放后,但指針值未被置空,這時(shí)在另一個(gè)地方引用該指針的值時(shí)會(huì)發(fā)生異常;6)、更改定義為常量的值;7)、動(dòng)態(tài)申請(qǐng)完一個(gè)內(nèi)存后,未檢查是否申請(qǐng)成功就調(diào)用了該指針;8)、對(duì)于一塊連續(xù)的內(nèi)存塊和“struct”數(shù)據(jù)結(jié)構(gòu)在第一次使用時(shí)沒有做初始化操作。9)、在用非ASCII(如中文字符、Unicode)編碼時(shí),若使用char*來申請(qǐng)空間,在用C庫中的字符串操作函數(shù)來操作,會(huì)因無法判斷字符串結(jié)束位置而產(chǎn)生異常。10)、指針類型強(qiáng)制轉(zhuǎn)換時(shí),當(dāng)強(qiáng)制轉(zhuǎn)換后指針指向的內(nèi)存空間大于原來指針指向的內(nèi)存空間時(shí)可能會(huì)出現(xiàn)異常(取決于堆或棧空間的結(jié)構(gòu)和大?。?,如把“INT12*”強(qiáng)制轉(zhuǎn)換成“INT32*”,應(yīng)當(dāng)盡量避免指針類型的強(qiáng)制轉(zhuǎn)換;11)、更改了數(shù)據(jù)結(jié)構(gòu),但代碼沒有相應(yīng)更新或整個(gè)工程中相關(guān)文件沒有做相應(yīng)更新;12)、申請(qǐng)的??臻g或堆空間超出了系統(tǒng)的容量限制;13)、棧溢出,當(dāng)函數(shù)中定義一個(gè)太大的數(shù)組時(shí)容易造成棧溢出,遞歸調(diào)用太深也容易造成棧舉出;14)、全局變量使用混亂,造成程序錯(cuò)亂;16)、內(nèi)存碎片太多,造成內(nèi)存分配失敗而導(dǎo)致程序異常,如建立一個(gè)太長的鏈表容易造成大量?jī)?nèi)存碎片;17)、文件操作過于頻繁(特別是寫操作),系統(tǒng)應(yīng)付不過來容易造成程序出現(xiàn)異常,這個(gè)在嵌入式系統(tǒng)中較常見。三、內(nèi)存泄漏預(yù)防措施在代碼審查時(shí),檢查函數(shù)體內(nèi)的每一個(gè)“return”前是否有沒有釋放必須要釋放的指針;設(shè)計(jì)“struct”數(shù)據(jù)結(jié)構(gòu)時(shí),應(yīng)當(dāng)設(shè)計(jì)相應(yīng)的釋放“struct”指針的函數(shù),并確保所有的“struct”體內(nèi)的指針都被釋放;對(duì)于用動(dòng)態(tài)內(nèi)存建立的鏈表在釋放時(shí)要一個(gè)一個(gè)結(jié)點(diǎn)去釋放, 對(duì)于每一個(gè)鏈表也要有相應(yīng)的鏈表內(nèi)存管理函數(shù),如鏈表的釋放函數(shù);當(dāng)一個(gè)指針變量要指向另一個(gè)動(dòng)態(tài)內(nèi)存地址時(shí)先檢查一下該指針是否有指向另一個(gè)動(dòng)態(tài)內(nèi)存地址,如果有則應(yīng)當(dāng)考慮是否要先釋放掉原先的指向的動(dòng)態(tài)內(nèi)存;在調(diào)用一個(gè)函數(shù)時(shí),對(duì)于函數(shù)的輸出值要確認(rèn)值的內(nèi)存空間是否是在函數(shù)內(nèi)部動(dòng)態(tài)申請(qǐng),如果是則應(yīng)當(dāng)考慮是適當(dāng)?shù)臅r(shí)候把它釋放掉;減少程序的出口的數(shù)目,最好是一個(gè)出口,在出口處理函數(shù)中確保釋放所有的動(dòng)態(tài)內(nèi)存;當(dāng)用戶強(qiáng)行退出時(shí),要考慮在每一個(gè)退出點(diǎn)是否能夠釋放所有的動(dòng)態(tài)內(nèi)存;釋放掉一個(gè)指針?biāo)傅膬?nèi)存空間后,就立即把改指針置為空;少用動(dòng)態(tài)申請(qǐng)內(nèi)存,能用數(shù)組代替的就用數(shù)組的形式;盡量減少全局變量的使用,避免指針指向的混亂;1封裝動(dòng)態(tài)內(nèi)存申請(qǐng)和釋放的底層函數(shù),便于檢查內(nèi)存泄漏問題;1把內(nèi)存泄漏的檢查方法放進(jìn)設(shè)計(jì)代碼中,便于發(fā)現(xiàn)內(nèi)存泄漏。四、程序運(yùn)行異常預(yù)防措施在釋放指針前先檢查指針是否為空;當(dāng)把指針作為參數(shù)傳入C庫函數(shù)中的參數(shù)時(shí),先檢查指針是否為空;在函數(shù)體內(nèi),當(dāng)要調(diào)用指針參數(shù)時(shí),先判斷該指針是否為空;當(dāng)要調(diào)用“struct”指針數(shù)據(jù)結(jié)構(gòu)中的分體時(shí)要先判斷該指針是否為空;當(dāng)做指針移動(dòng)操作時(shí)要考慮指針是否會(huì)發(fā)生越界;當(dāng)一個(gè)函數(shù)體內(nèi)可能會(huì)改變參數(shù)中的值時(shí),要避免傳入常量形式的值,在設(shè)計(jì)函數(shù)時(shí)要盡量避免試圖去改變參數(shù)中的值;動(dòng)態(tài)申請(qǐng)完一個(gè)內(nèi)存后要先檢查是否申請(qǐng)成功;對(duì)于一塊連續(xù)的內(nèi)存塊和“struct”數(shù)據(jù)結(jié)構(gòu)在第一次使用時(shí)要做初始化操作,如申請(qǐng)完內(nèi)存后,記得用memset清空內(nèi)存;備案所有的全局變量,考慮全局變量對(duì)程序可能產(chǎn)生的影響,盡量少用全局變量。對(duì)于全局變量的定義最好使用“static”來申明,不讓其它模塊直接訪問該全局變量,并且設(shè)計(jì)好相應(yīng)的操作該全局變量的方法函數(shù),在定義全局變量時(shí)要充分考慮好全局變量的初始化方法和程序結(jié)束時(shí)的處理方法,對(duì)于整個(gè)工程中的全局變量要進(jìn)行登記管理,登記內(nèi)容包括變量名、類型名、定義位置、使用范圍、使用目的、初始化方法、程序結(jié)束時(shí)的處理方法及其它注意事項(xiàng)。在用非ASCII(如中文字符、Unicode)編碼時(shí),要使用unsigned char*來申請(qǐng)空間,并記住申請(qǐng)空間大小,不要用C庫中的字符串操作函數(shù)來操作。1記得申請(qǐng)足夠的內(nèi)存,比如,儲(chǔ)存年份應(yīng)該是5個(gè)空間而不是4個(gè),記得保留‘’的空間;1在函數(shù)中最好不要定義占用內(nèi)存太大的局部變量,否則容易造成棧溢出,對(duì)于較大內(nèi)存的使用最好是使用堆內(nèi)存空間的方法。由于棧溢出這種情況比較不常見,容易被人忽視,所以在發(fā)生因棧溢出而產(chǎn)生問題時(shí)往往不容易被發(fā)現(xiàn)原因所在;1盡量不頻繁分配小塊的內(nèi)存;1在設(shè)計(jì)遞歸調(diào)用時(shí)要考慮遞歸調(diào)用可能的深度,防止出現(xiàn)棧溢出;1不要定義太多的局部變量,如果要定義一個(gè)數(shù)組類型的局部變量,數(shù)組不要太長,以防止出現(xiàn)棧溢出;1減少讀寫文件的次數(shù),優(yōu)化文件的讀寫方法。指針是C/C++的精華,也是最難的部分。本書中規(guī)中矩地講解了指針的概念、定義與初始化、操作等。指針的靈活性可以把大量的工作化繁為易,前提是必須首很把足夠繁的指針弄懂。聽起來有點(diǎn)像繞口令,事實(shí)就是這樣,你現(xiàn)在把難懂的東西弄懂了,日后可以把難事化簡(jiǎn),大事化小。從VB過來的人一定會(huì)熟悉“值傳遞”和“地址傳遞”這兩個(gè)概念,實(shí)際上,“地址傳遞”這種說法正是為了彌補(bǔ)VB沒有指針卻有類似的需要才發(fā)明的。我認(rèn)為C/C++程序員要想深入理解指針,首先要拋棄這個(gè)概念。在C/C++程序中,即使在函數(shù)調(diào)用中傳遞指針,也不能說“地址傳遞”,還應(yīng)該說是值傳遞,只不過這次傳遞的值有點(diǎn)特殊,特殊在于借用這個(gè)值,可以找到其它值。就好像我給你一把鑰匙一樣,你通過鑰匙可以間接獲得更多,但是我給你的只不過是鑰匙。我前陣子曾寫過一篇關(guān)于指針的文章,之所以寫那篇文章,是因?yàn)榭吹揭淮蠖殉鯇W(xué)者在論壇上提問。通過對(duì)他們提的問題的分析,我總結(jié)了幾點(diǎn)。下面,首先就先引用我自己寫的《關(guān)于指針》中的片段吧(完整的文章請(qǐng)到我的個(gè)人主頁查找):一、指針就是變量:雖然申明指針的時(shí)候也提類型,如:char *p1。int *p2。float *p3。double *p4。.....但是,這只表示該指針指向某類型的數(shù)據(jù),而不表示該指針的類型。說白了,指針都是一個(gè)類型:四字節(jié)無符號(hào)整數(shù)(將來的64位系統(tǒng)中可能有變化)。二、指針的加減運(yùn)算很特殊:p++、p之類的運(yùn)算并不是讓p這個(gè)“四字節(jié)無符號(hào)整數(shù)”加一或減一,而是讓它指向下一個(gè)或上一個(gè)存儲(chǔ)單元,它實(shí)際加減的值就是它所指類型的值的size。比如:char *型指針,每次加減的改變量都是1;float *型的指針,每次加減的改變量都是4;void *型指針無法加減。還要注意的是:指針不能相加,指針相減的差為int型。正是因?yàn)橹羔樣兄煌谄渌兞康倪\(yùn)算方式,所以,在任何時(shí)候用到指針都必須明確“指針的類型”(即指針?biāo)傅淖兞康念愋停?。這就不難理解為什么函數(shù)聲明時(shí)必須用“int abc(char *p)”而調(diào)用的時(shí)候卻成了“a = abc(p)。”這樣的形式了。三、用指針做參數(shù)傳遞的是指針值,不是指針本身:要理解參數(shù)傳遞,首先必須把“形參”與“實(shí)參”弄明白。函數(shù)A在調(diào)用函數(shù)B時(shí),如果要傳遞一個(gè)參數(shù)C,實(shí)際是在函數(shù)B中重新建立一個(gè)變量C,并將函數(shù)A中的C值傳入其中,于是函數(shù)B就可以使用這個(gè)值了,在函數(shù)B中,無論有沒有修改這個(gè)C值,對(duì)于函數(shù)A中的C都沒有影響。函數(shù)B結(jié)束時(shí),會(huì)將所有內(nèi)存收回,局部變量C被銷毀,函數(shù)B對(duì)變量C所做的一切修改都將被拋棄。以上示例中,函數(shù)A中的變量C稱為“實(shí)參”,函數(shù)B中的變量C被稱為“形參”,調(diào)用函數(shù)時(shí),會(huì)在B函數(shù)體內(nèi)建立一個(gè)形參,該形參的值與實(shí)參的值是相同的,但是形參的改變不影響實(shí)參,函數(shù)結(jié)束時(shí),形參被銷毀,實(shí)參依然沒有發(fā)生變化。指針也是一個(gè)變量,所以它也符合以上的規(guī)定,但是,指針存放的不僅僅是一個(gè)值,而是一個(gè)內(nèi)存地址。B函數(shù)對(duì)這個(gè)地址進(jìn)行了改動(dòng),改動(dòng)的并不是形參,而是形參所指的內(nèi)存。由于形參的值與實(shí)參的值完全相同,所以,實(shí)參所指的內(nèi)存也被修改。函數(shù)結(jié)束時(shí),雖然這個(gè)形參會(huì)被銷毀,指針的變化無法影響實(shí)參,但此前對(duì)它所指的內(nèi)存的修改會(huì)持續(xù)有效。所以,把指針作為參數(shù)可以在被調(diào)函數(shù)(B)中改變主調(diào)函數(shù)(A)中的變量,好像形參影響了實(shí)參一樣。注意:是“好像”。在這過程中,函數(shù)B影響的不是參數(shù),而是內(nèi)存。下面再來看剛才的例子:“int abc(char *p)”和“a = abc(p)?!?。為什么申請(qǐng)中要用*號(hào),因?yàn)楹瘮?shù)必須知道這是指針;為什么調(diào)用時(shí)不加*號(hào),因?yàn)閭鬟f的是“指針值”,而不是“指針?biāo)竷?nèi)存的值”。四、指向指針的指針:正因?yàn)橹羔樢彩且粋€(gè)變量,它一樣要尊守形參與實(shí)參的規(guī)定。所以,雖然指針做參數(shù)可以將函數(shù)內(nèi)對(duì)變量的修改帶到函數(shù)外,但是,函數(shù)體內(nèi)對(duì)指針本身作任何修都將被丟棄。如果除了對(duì)變量的修改帶到函數(shù)外,還要讓指針本身被修改而且要影響函數(shù)外,那么,被調(diào)函數(shù)就應(yīng)該知道“該指針?biāo)诘膬?nèi)存地址”。這時(shí),指針不再是指針,而是“普通變量”。作為參數(shù)傳遞的不是這個(gè)“普通變量”,而是指向這個(gè)“普通變量”的指針。即“指向指針的指針”。如果p是一個(gè)指向指針的指針,那么*p就是一個(gè)指針,我們不妨就把它看成q。要訪問q指針?biāo)傅膬?nèi)存,只要*q就是了。用初中數(shù)學(xué)的“等量代換”一換就知道,*q就是**p。五、指針數(shù)組。之所以要把“指針數(shù)組”單獨(dú)提出來,是因?yàn)閿?shù)組本身就與指針有著千絲萬縷的關(guān)系。即使你不想用指針,只要你使用了數(shù)組,實(shí)際就在與指針打交道了。只要理解了指針本身就是變量,就不難理解“指針數(shù)組”,我們可以暫且把它當(dāng)成普通數(shù)組來處理,a[0]、a[1]、a[2]……就是數(shù)組的元素,只是,a[0]是一個(gè)指針,a[1]、a[2]也是一個(gè)指針。那a呢?當(dāng)然也是指針,但這是兩碼事。你可以完全無視a的存在,只去管a[0]等元素。*a[0]與*p沒有什么本質(zhì)的區(qū)別。還有一個(gè)東西不得不提一下,它比較重要:指針的定義有兩個(gè)可取的方式,它們各有優(yōu)缺點(diǎn):“int *p?!焙汀癷nt* p?!笔峭耆葍r(jià)的,后者的好處是讓人體會(huì)到p是一個(gè)“指向int的”指針,前者會(huì)讓人誤解為*p是一個(gè)int型變量(這里沒有定義int型變量);但是前者的好處是不會(huì)產(chǎn)生混淆,如“int *p, *q。”讓人一眼就看出定義了兩個(gè)指針,而“int* p,q?!睍?huì)讓人誤解成定義了兩個(gè)指針(實(shí)際上q不是指針)。C是一個(gè)結(jié)構(gòu)化語言,如譚老爺子所說:它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計(jì)首要考慮的是如何通過一個(gè)過程,對(duì)輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制),而對(duì)于C++,首要考慮的是如何構(gòu)造一個(gè)對(duì)象模型,讓這個(gè)模型能夠契合與之對(duì)應(yīng)的問題域,這樣就可以通過獲取對(duì)象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制。所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”,而就語言本身而言,在C中更多的是算法的概念。
點(diǎn)擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1