

下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C+吶存管理詳解程序員們經(jīng)常編寫內(nèi)存管理程序,往往提心吊膽。如果不想觸雷,唯一的解 決辦法就是發(fā)現(xiàn)所有潛伏的地雷并且排除它們,躲是躲不了的。本文的內(nèi)容 比一般教科書的要深入得多,讀者需細(xì)心閱讀,做到真正地通曉內(nèi)存管 理。1、 內(nèi)存分配方式內(nèi)存分配方式有三種:(1) 從靜態(tài)存儲(chǔ)區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這 塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量, static 變量。(2) 在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以 在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi) 置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。(3) 從堆上分
2、配,亦稱動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用 malloc 或 new申請(qǐng)任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用 free 或 delete 釋放 內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期由我們決定,使用非常靈活,但問題也最多。2、 常見的內(nèi)存錯(cuò)誤及其對(duì)策 發(fā)生內(nèi)存錯(cuò)誤是件非常麻煩的事情。 編譯器不能自動(dòng)發(fā)現(xiàn)這些錯(cuò)誤, 通常是 在程序運(yùn)行時(shí)才能捕捉到。 而這些錯(cuò)誤大多沒有明顯的癥狀,時(shí)隱時(shí)現(xiàn),增 加了改錯(cuò)的難度。 有時(shí)用戶怒氣沖沖地把你找來, 程序卻沒有發(fā)生任何問題, 你一走,錯(cuò)誤又發(fā)作了。 常見的內(nèi)存錯(cuò)誤及其對(duì)策如下:* 內(nèi)存分配未成功,卻使用了它。編程新手常犯這種錯(cuò)誤,因?yàn)樗麄儧]有意識(shí)到內(nèi)存分配會(huì)不成功。常用
3、解決辦法是,在使用內(nèi)存之前檢查指針是否為 NULL 如果指針 p 是函數(shù)的參 數(shù),那么在函數(shù)的入口處用 assert(p!=NULL) 進(jìn)行檢查。 如果是用 malloc 或 new 來申請(qǐng)內(nèi)存, 應(yīng)該用 if(p=NULL)或 if(p!=NULL)進(jìn)行防錯(cuò)處理。*內(nèi)存分配雖然成功,但是尚未初始化就引用它。犯這種錯(cuò)誤主要有兩個(gè)起因:一是沒有初始化的觀念;二是誤以為內(nèi)存 的缺省初值全為零,導(dǎo)致引用初值錯(cuò)誤(例如數(shù)組)。內(nèi)存的缺省初值究竟 是什么并沒有統(tǒng)一的標(biāo)準(zhǔn),盡管有些時(shí)候?yàn)榱阒担覀儗幙尚牌錈o不可信其 有。所以無論用何種方式創(chuàng)建數(shù)組,都別忘了賦初值,即便是賦零值也不可 省略,不要嫌麻煩。*內(nèi)
4、存分配成功并且已經(jīng)初始化,但操作越過了內(nèi)存的邊界。例如在使用數(shù)組時(shí)經(jīng)常發(fā)生下標(biāo)“多 1”或者“少 1”的操作。特別是在 for 循環(huán)語句中,循環(huán)次數(shù)很容易搞錯(cuò),導(dǎo)致數(shù)組操作越界。忘記了釋放內(nèi)存,造成內(nèi)存泄露含有這種錯(cuò)誤的函數(shù)每被調(diào)用一次就丟失一塊內(nèi)存。 剛開始時(shí)系統(tǒng)的內(nèi) 存充足, 你看不到錯(cuò)誤。 終有一次程序突然死掉, 系統(tǒng)出現(xiàn)提示: 內(nèi)存耗盡。動(dòng)態(tài)內(nèi)存的申請(qǐng)與釋放必須配對(duì), 程序中 malloc 與 free 的使用次數(shù)一 定要相同,否則肯定有錯(cuò)誤( new/delete 同理)。* 釋放了內(nèi)存卻繼續(xù)使用它。有三種情況:(1)程序中的對(duì)象調(diào)用關(guān)系過于復(fù)雜,實(shí)在難以搞清楚某個(gè)對(duì)象究竟 是否已經(jīng)
5、釋放了內(nèi)存,此時(shí)應(yīng)該重新設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu),從根本上解決對(duì)象管理 的混亂局面。( 2)函數(shù)的 return 語句寫錯(cuò)了,注意不要返回指向“棧內(nèi)存”的“指 針”或者“引用”,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束時(shí)被自動(dòng)銷毀。(3)使用 free 或 delete 釋放了內(nèi)存后,沒有將指針設(shè)置為 NULL 導(dǎo) 致產(chǎn)生“野指針”?!疽?guī)則 1用 malloc 或 new 申請(qǐng)內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL 防止使用指針值為 NULL 的內(nèi)存?!疽?guī)則 2不要忘記為數(shù)組和動(dòng)態(tài)內(nèi)存賦初值。防止將未被初始化的內(nèi)存作為右值使用?!疽?guī)則 3】避免數(shù)組或指針的下標(biāo)越界,特別要當(dāng)心發(fā)生“多 1”或者“少 1”操作。【規(guī)則 4
6、】動(dòng)態(tài)內(nèi)存的申請(qǐng)與釋放必須配對(duì),防止內(nèi)存泄漏?!疽?guī)則 5】用 free 或 delete 釋放了內(nèi)存之后, 立即將指針設(shè)置為 NULL, 防止產(chǎn)生“野指針”。3、指針與數(shù)組的對(duì)比C+/C 程序中,指針和數(shù)組在不少地方可以相互替換著用,讓人產(chǎn)生一 種錯(cuò)覺,以為兩者是等價(jià)的。數(shù)組要么在靜態(tài)存儲(chǔ)區(qū)被創(chuàng)建(如全局?jǐn)?shù)組),要么在棧上被創(chuàng)建。數(shù) 組名對(duì)應(yīng)著(而不是指向)一塊內(nèi)存,其地址與容量在生命期內(nèi)保持不變,只有數(shù)組的內(nèi)容可以改變。指針可以隨時(shí)指向任意類型的內(nèi)存塊,它的特征是“可變”,所以我們 常用指針來操作動(dòng)態(tài)內(nèi)存。指針遠(yuǎn)比數(shù)組靈活,但也更危險(xiǎn)。下面以字符串為例比較指針與數(shù)組的特性。3.1 修改內(nèi)容示
7、例 3-1 中,字符數(shù)組 a 的容量是 6 個(gè)字符,其內(nèi)容為 hello。a 的內(nèi) 容可以改變,如 a0= X。指針 p 指向常量字符串“ world ” (位于靜態(tài)存儲(chǔ)區(qū),內(nèi)容為 world ),常量字符串的內(nèi)容是不可以被修改的。從語法上看,編譯器并不覺得語句p0= X 有什么不妥,但是該語句企圖修改常量字符串的內(nèi)容而導(dǎo)致運(yùn)行錯(cuò)誤。char a =“hello ”;a0 = X;cout a endl;char *p =“ world ” ; / 注意 p 指向常量字符串p0 = X ; / 編譯器不能發(fā)現(xiàn)該錯(cuò)誤cout p endl;示例 3.1 修改數(shù)組和指針的內(nèi)容3.2 內(nèi)容復(fù)制與比較
8、不能對(duì)數(shù)組名進(jìn)行直接復(fù)制與比較。示例 7-3-2 中,若想把數(shù)組 a 的內(nèi) 容復(fù)制給數(shù)組 b,不能用語句 b = a,否則將產(chǎn)生編譯錯(cuò)誤。應(yīng)該用標(biāo)準(zhǔn)庫 函數(shù) strcpy進(jìn)行復(fù)制。同理,比較 b 和 a 的內(nèi)容是否相同,不能用 if(b=a) 來判斷,應(yīng)該用標(biāo)準(zhǔn)庫函數(shù) strcmp 進(jìn)行比較。語句 p = a 并不能把 a 的內(nèi)容復(fù)制指針 p,而是把 a 的地址賦給了 p。要想復(fù)制 a 的內(nèi)容,可以先用庫函數(shù) malloc 為 p 申請(qǐng)一塊容量為strlen(a)+1 個(gè)字符的內(nèi)存,再用 strcpy 進(jìn)行字符串復(fù)制。同理,語句if(p=a) 比較的不是內(nèi)容而是地址,應(yīng)該用庫函數(shù) strcmp
9、 來比較。/ 數(shù)組char a = hello;char b10;strcpy(b, a); / 不能用 b = a;if(strcmp(b, a) = 0) /不能用 if (b = a)/ 指針int len = strlen(a);char *p = (char *)malloc(sizeof(char)*(len+1); strcpy(p,a); /不要用 p = a;if(strcmp(p, a) = 0) /不要用 if (p = a)示例 3.2 數(shù)組和指針的內(nèi)容復(fù)制與比較3.3 計(jì)算內(nèi)存容量用運(yùn)算符 sizeof 可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))。示例 7-3-3 (a)中,si
10、zeof(a)的值是 12 (注意別忘了)。指針a,但是 sizeof(p)的值卻是 4。這是因?yàn)?sizeof(p)得到的是一個(gè)指針變量p 指向的字節(jié)數(shù),相當(dāng)于 sizeof(char*) ,而不是 p 所指的內(nèi)存容量。 C+/C 語言 沒有辦法知道指針?biāo)傅膬?nèi)存容量,除非在申請(qǐng)內(nèi)存時(shí)記住它。注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí),該數(shù)組自動(dòng)退化為同類型的指針。示例 7-3-3 (b)中,不論數(shù)組 a 的容量是多少,sizeof(a)始終等于 sizeof(char *)。char a = hello world;char *p = a;cout sizeof(a) endl; / 12字節(jié)co
11、ut sizeof(p) endl; / 4字節(jié)示例 3.3 (a)計(jì)算數(shù)組和指針的內(nèi)存容量void Func(char a100)cout sizeof(a) endl; / 4示例 3.3 ( b) 數(shù)組退化為指針4、指針參數(shù)是如何傳遞內(nèi)存的?如果函數(shù)的參數(shù)是一個(gè)指針, 不要指望用該指針去申請(qǐng)動(dòng)態(tài)內(nèi)存。 示例 7-4-1 中,Test 函數(shù)的語句 GetMemory(str, 200) 并沒有使 str 獲得期望的內(nèi)存, str 依舊是NULL 為什么?void GetMemory(char *p, int num)字節(jié)而不是 100 字節(jié)p = (char *)malloc(sizeof
12、(char) * num);void Test(void)char *str = NULL;GetMemory(str, 100); / str 仍然為 NULLstrcpy(str, hello); /運(yùn)行錯(cuò)誤示例 4.1 試圖用指針參數(shù)申請(qǐng)動(dòng)態(tài)內(nèi)存毛病出在函數(shù) GetMemoryK 編譯器總是要為函數(shù)的每個(gè)參數(shù)制作臨時(shí)副本, 指針參數(shù) p 的副本是 _p ,編譯器使 _p = p 。如果函數(shù)體內(nèi)的程序修改了 _p 的內(nèi)容,就導(dǎo)致參數(shù) p 的內(nèi)容作相應(yīng)的修改。這就是指針可以用作輸出參數(shù) 的原因。在本例中, _p 申請(qǐng)了新的內(nèi)存, 只是把 _p 所指的內(nèi)存地址改變了, 但是 p 絲毫未變。所以
13、函數(shù) GetMemory 并不能輸出任何東西。事實(shí)上,每執(zhí) 行一次 GetMemory就會(huì)泄露一塊內(nèi)存,因?yàn)闆]有用 free 釋放內(nèi)存如果非得要用指針參數(shù)去申請(qǐng)內(nèi)存, 那么應(yīng)該改用“指向指針的指針 見示例4.2 。void GetMemory2(char *p, int num)*p = (char *)malloc(sizeof(char) * num);void Test2(void)char *str = NULL;GetMemory2(&str, 100); / 注意參數(shù)是 &str ,而不是 str strcpy(str, hello);cout str endl;f
14、ree(str);示例 4.2 用指向指針的指針申請(qǐng)動(dòng)態(tài)內(nèi)存由于“指向指針的指針”這個(gè)概念不容易理解,我們可以用函數(shù)返回值來傳遞動(dòng)態(tài)內(nèi)存。這種方法更加簡(jiǎn)單,見示例 4.3 。char *GetMemory3(int num)char *p = (char *)malloc(sizeof(char) * num);return p;void Test3(void)char *str = NULL;str = GetMemory3(100);strcpy(str, hello);cout str endl;free(str);示例 4.3 用函數(shù)返回值來傳遞動(dòng)態(tài)內(nèi)存用函數(shù)返回值來傳遞動(dòng)態(tài)內(nèi)存這種方
15、法雖然好用,但是常常有人把 return語句用錯(cuò)了。這里強(qiáng)調(diào)不要用 return 語句返回指向“棧內(nèi)存”的指針,因?yàn)樵搩?nèi)存在函數(shù)結(jié)束時(shí)自動(dòng)消亡,見示例 4.4 char *GetString(void)char p = hello world;return p; /編譯器將提出警告void Test4(void)char *str = NULL;str = GetString(); / str的內(nèi)容是垃圾cout str endl;示例 4.4 return 語句返回指向“棧內(nèi)存”的指針用調(diào)試器逐步跟蹤 Test4 ,發(fā)現(xiàn)執(zhí)行 str = GetString 語句后 str 不再是 NULL
16、指針,但是 str 的內(nèi)容不是“ hello world ”而是垃圾。如果把示例 4.4 改寫成示例 4.5 ,會(huì)怎么樣?char *GetString2(void)char *p = hello world;return p;void Test5(void)char *str = NULL;str = GetString2();cout str endl;示例 4.5 return 語句返回常量字符串函數(shù) Test5 運(yùn)行雖然不會(huì)出錯(cuò),但是函數(shù) GetString2 的設(shè)計(jì)概念卻是 錯(cuò)誤的。因?yàn)?GetString2 內(nèi)的“ hello world ”是常量字符串,位于靜態(tài)存 儲(chǔ)區(qū),它在程序
17、生命期內(nèi)恒定不變。 無論什么時(shí)候調(diào)用 GetString2 ,它返回 的始終是同一個(gè)“只讀”的內(nèi)存塊5、杜絕“野指針”“野指針”不是 NULL 指針,是指向“垃圾”內(nèi)存的指針。人們一般不會(huì)錯(cuò) 用NULL 指針,因?yàn)橛?if 語句很容易判斷。但是“野指針”是很危險(xiǎn)的,if 語句對(duì)它不起作用。 “野指針”的成因主要有兩種:( 1)指針變量沒有被初始化。任何指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL 指針,它的缺省值是隨機(jī)的,它會(huì)亂指一氣。所以, 指針變量在創(chuàng)建的 同時(shí)應(yīng)當(dāng)被初始化,要么將指針設(shè)置為 NULL 要么讓它指向合法的內(nèi)存。例 如char *p = NULL;char *str = (char
18、 *) malloc(100);(2)指針 p 被 free 或者 delete 之后, 沒有置為 NULL 讓人誤以為 p 是個(gè)合法的指針。(3)指針操作超越了變量的作用范圍。這種情況讓人防不勝防,示例 程序如下:class Apublic:void Func(void) coutFunc(); / p 是“野指針”Func() 時(shí),對(duì)象 a 已經(jīng)消失,而 p 是指向 a的,所以 p 就成了“野指針”。但奇怪的是我運(yùn)行這個(gè)程序時(shí)居然沒有出錯(cuò), 這可能與編譯器有關(guān)。6、有了 malloc/free 為什么還要 new/delete ?malloc 與 free 是 C+/C 語言的標(biāo)準(zhǔn)庫函數(shù),
19、new/delete 是 C+勺運(yùn)算符。它們都可用于申請(qǐng)動(dòng)態(tài)內(nèi)存和釋放內(nèi)存。對(duì)于非內(nèi)部數(shù)據(jù)類型的對(duì)象而言,光用 maloc/free 無法滿足動(dòng)態(tài)對(duì)象 的要求。對(duì)象在創(chuàng)建的同時(shí)要自動(dòng)執(zhí)行構(gòu)造函數(shù),對(duì)象在消亡之前要自動(dòng)執(zhí) 行析構(gòu)函數(shù)。由于 malloc/free 是庫函數(shù)而不是運(yùn)算符,不在編譯器控制權(quán) 限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于 malloc/free 。因此 C+語言需要一個(gè)能完成動(dòng)態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,以及一個(gè)能完成清理與釋放內(nèi)存工作的運(yùn)算符 delete 。注意 new/delete 不 是庫函數(shù)。我們先看一看 malloc/free 和 new/d
20、elete 如何實(shí)現(xiàn)對(duì)象的動(dòng)態(tài) 內(nèi)存管理,見示例 6。class Objpublic :Obj(void) cout “Destroy ” endl; void Initialize(void) cout “Initialization” endl; void Destroy(void) cout “Destroy ” Initialize(); / 初始化a-Destroy(); / 清除工作free(a); / 釋放內(nèi)存void UseNewDelete(void)Obj *a = new Obj; / 申請(qǐng)動(dòng)態(tài)內(nèi)存并且初始化/ delete a; / 清除并且釋放內(nèi)存Obj(void)
21、coutInitialization endl; 示例 6 用 malloc/free 和 new/delete 如何實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)內(nèi)存管理類 Obj 的函數(shù) Initialize 模擬了構(gòu)造函數(shù)的功能,函數(shù) Destroy 模擬 了析構(gòu)函數(shù)的功能。 函數(shù) UseMallocFree 中,由于 malloc/free 不能執(zhí)行構(gòu) 造函數(shù)與析構(gòu)函數(shù),必須調(diào)用成員函數(shù) Initialize 和 Destroy 來完成初始 化與清除工作。函數(shù)UseNewDelete 則簡(jiǎn)單得多。所以我們不要企圖用 malloc/free 來完成動(dòng)態(tài)對(duì)象的內(nèi)存管理, 應(yīng)該用new/delete 。由于內(nèi)部數(shù)據(jù)類型的“
22、對(duì)象”沒有構(gòu)造與析構(gòu)的過程,對(duì)它們 而言malloc/free 和 new/delete 是等價(jià)的。既然 new/delete 的功能完全覆蓋了 malloc/free , 為什么 C+不把 malloc/free淘汰出局呢?這是因?yàn)?C+程序經(jīng)常要調(diào)用 C 函數(shù),而 C 程序 只能用 malloc/free管理動(dòng)態(tài)內(nèi)存。如果用 free 釋放“new 創(chuàng)建的動(dòng)態(tài)對(duì)象”,那么該對(duì)象因無法執(zhí)行析構(gòu)函數(shù) 而可能導(dǎo)致程序出錯(cuò)。如果用 delete 釋放“ malloc 申請(qǐng)的動(dòng)態(tài)內(nèi)存”,理 論上講程序不會(huì)出錯(cuò),但是該程序的可讀性很差。所以 new/delete 必須配 對(duì)使用,malloc/free
23、 也一樣。7、內(nèi)存耗盡怎么辦?如果在申請(qǐng)動(dòng)態(tài)內(nèi)存時(shí)找不到足夠大的內(nèi)存塊, malloc 和 new 將返回 NULL 指針,宣告內(nèi)存申請(qǐng)失敗。通常有三種方式處理“內(nèi)存耗盡”問題。(1)判斷指針是否為 NULL 如果是則馬上用 return 語句終止本函數(shù)。例如:void Func(void)A *a = new A;if(a = NULL)return;(2)判斷指針是否為 NULL 如果是則馬上用 exit(1)終止整個(gè)程序的運(yùn)行。例如:void Func(void)A *a = new A;if(a = NULL)cout “Memory Exhausted” endl; exit(1);
24、(3)為 new 和 malloc 設(shè)置異常處理函數(shù)。例如 Visual C+可以用_set_new_hander 函數(shù)為 new 設(shè)置用戶自己定義的異常處理函數(shù),也可以讓malloc 享用與 new 相同的異常處理函數(shù)。詳細(xì)內(nèi)容請(qǐng)參考 C+使用手冊(cè)。上述( 1)(2)方式使用最普遍。如果一個(gè)函數(shù)內(nèi)有多處需要申請(qǐng)動(dòng)態(tài) 內(nèi)存,那么方式( 1)就顯得力不從心(釋放內(nèi)存很麻煩),應(yīng)該用方式( 2) 來處理。很多人不忍心用 exit(1) ,問:“不編寫出錯(cuò)處理程序,讓操作系統(tǒng)自 己解決行不行?”不行。如果發(fā)生“內(nèi)存耗盡”這樣的事情,一般說來應(yīng)用程序已經(jīng)無藥 可救。如果不用 exit(1) 把壞程序殺
25、死, 它可能會(huì)害死操作系統(tǒng)。 道理如同: 如果不把歹徒擊斃,歹徒在老死之前會(huì)犯下更多的罪。有一個(gè)很重要的現(xiàn)象要告訴大家。對(duì)于 32 位以上的應(yīng)用程序而言,無論怎樣使用 malloc 與 new,幾乎不可能導(dǎo)致“內(nèi)存耗盡”。我在 Windows98 下用Visual C+編寫了測(cè)試程序,見示例 7。這個(gè)程序會(huì)無休止地運(yùn)行下去,根本不會(huì)終止。因?yàn)?32 位操作系統(tǒng)支持“虛存”,內(nèi)存用完了,自動(dòng)用硬 盤空間頂替。我只聽到硬盤嘎吱嘎吱地響, Window 98 已經(jīng)累得對(duì)鍵盤、鼠 標(biāo)毫無反應(yīng)。我可以得出這么一個(gè)結(jié)論:對(duì)于 32 位以上的應(yīng)用程序, “內(nèi)存耗盡”錯(cuò)誤處理程序毫無用處。這下可把 Unix
26、和 Windows 程序員們樂壞了 :反正 錯(cuò)誤處理程序不起作用,我就不寫了,省了很多麻煩。我不想誤導(dǎo)讀者,必須強(qiáng)調(diào):不加錯(cuò)誤處理將導(dǎo)致程序的質(zhì)量很差,千 萬不可因小失大。void main(void)float *p = NULL;while(TRUE)p = new float1000000;cout “eat memory ” endl;if(p=NULL)exit(1);示例 7 試圖耗盡操作系統(tǒng)的內(nèi)存8、 malloc/free 的使用要點(diǎn)函數(shù) malloc 的原型如下:void * malloc(size_t size);用 malloc 申請(qǐng)一塊長(zhǎng)度為 length 的整數(shù)類型的
27、內(nèi)存,程序如下:int *p = (int *) malloc(sizeof(int) * length);我們應(yīng)當(dāng)把注意力集中在兩個(gè)要素上:“類型轉(zhuǎn)換”和“ sizeof* malloc 返回值的類型是 void * ,所以在調(diào)用 malloc 時(shí)要顯式地進(jìn)行 類型轉(zhuǎn)換,將 void * 轉(zhuǎn)換成所需要的指針類型。* malloc 函數(shù)本身并不識(shí)別要申請(qǐng)的內(nèi)存是什么類型, 它只關(guān)心內(nèi)存的 總字節(jié)數(shù)。我們通常記不住 int, float等數(shù)據(jù)類型的變量的確切字節(jié)數(shù)。例如 int 變量在 16 位系統(tǒng)下是 2 個(gè)字節(jié),在 32 位下是 4 個(gè)字節(jié);而 float 變量在 16 位系統(tǒng)下是 4 個(gè)字
28、節(jié),在 32 位下也是 4 個(gè)字節(jié)。最好用以下程序 作一次測(cè)試:cout sizeof(char) endl;cout sizeof(int) endl;cout sizeof(unsigned int) endl;cout sizeof(long) endl;cout sizeof(unsigned long) endl;cout sizeof(float) endl;cout sizeof(double) endl;cout sizeof(void *) endl;在 malloc 的“ () ”中使用 sizeof 運(yùn)算符是良好的風(fēng)格,但要當(dāng)心有時(shí) 我們會(huì)昏了頭,寫出 p = malloc(sizeof(p) 這樣的程序來* 函數(shù) free 的原型如下:void free( void * memblock );為什么 free 函數(shù)不象 malloc 函數(shù)那樣復(fù)雜呢?這是因?yàn)橹羔?p 的類型 以及它所指的內(nèi)存的容量事先都是知道的, 語句 free(p) 能正確地釋
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合伙開店鋪合同協(xié)議書
- 2025年燒結(jié)釤鈷永磁材料合作協(xié)議書
- 護(hù)理超聲培訓(xùn)課程
- 國(guó)際會(huì)議同傳翻譯設(shè)備租賃與翻譯培訓(xùn)全面服務(wù)合同
- 靜脈輸血病人護(hù)理
- 網(wǎng)店過戶交易安全保障與后續(xù)運(yùn)營(yíng)支持合同
- 區(qū)塊鏈智能合約代碼智能合約安全審計(jì)與合規(guī)審查補(bǔ)充協(xié)議
- 離婚協(xié)議財(cái)產(chǎn)債務(wù)分割及免除條款合同
- 游戲公會(huì)會(huì)員招募與培訓(xùn)服務(wù)協(xié)議
- 網(wǎng)絡(luò)內(nèi)容審核系統(tǒng)軟件租賃與功能優(yōu)化升級(jí)服務(wù)協(xié)議
- 《三只松鼠公司基于近三年數(shù)據(jù)的財(cái)務(wù)探析(4200字論文)》
- 《可復(fù)制的領(lǐng)導(dǎo)力》讀書分享
- GB/T 25085.2-2024道路車輛汽車電纜第2部分:試驗(yàn)方法
- 【水利水電】李想 案例專項(xiàng)班教案 03-案例專項(xiàng)班(三)
- 水利工程項(xiàng)目預(yù)算管理方案
- 銀行大額存單業(yè)務(wù)培訓(xùn)
- DB37-T 4733-2024預(yù)制艙式儲(chǔ)能電站設(shè)計(jì)規(guī)范
- wps計(jì)算機(jī)二級(jí)試題及答案
- 鋼板樁安全技術(shù)交底
- 師德師風(fēng)-做“四有”好老師
- 衣食住行見證改革開放時(shí)代變遷-(修訂)
評(píng)論
0/150
提交評(píng)論