• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 19,  comments - 21,  trackbacks - 0
            一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子:
                1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)
                2). 一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables)
                3). 多線程應(yīng)用中被幾個任務(wù)共享的變量
                回答不出這個問題的人是不會被雇傭的。我認為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內(nèi)容將會帶來災(zāi)難。
                假設(shè)被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要性。
                1). 一個參數(shù)既可以是const還可以是volatile嗎?解釋為什么。
                2). 一個指針可以是volatile 嗎?解釋為什么。
                3). 下面的函數(shù)有什么錯誤:
                     int square(volatile int *ptr)
                     {
                          return *ptr * *ptr;
                     }
                下面是答案:
                1). 是的。一個例子是只讀的狀態(tài)寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應(yīng)該試圖去修改它。
                2). 是的。盡管這并不很常見。一個例子是當(dāng)一個中服務(wù)子程序修該一個指向一個buffer的指針時。
                3). 這段代碼的有個惡作劇。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:
                int square(volatile int *ptr)  
                {
                     int a,b;
                     a = *ptr;
                     b = *ptr;
                     return a * b;
                 }
                由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:
                 long square(volatile int *ptr)  
                 {
                        int a;
                        a = *ptr;
                        return a * a;
                 }

            講講我的理解: (歡迎打板子...~~!)

            關(guān)鍵在于兩個地方:      
              
            1. 編譯器的優(yōu)化  (請高手幫我看看下面的理解)

            在本次線程內(nèi), 當(dāng)讀取一個變量時,為提高存取速度,編譯器優(yōu)化時有時會先把變量讀取到一個寄存器中;以后,再取變量值時,就直接從寄存器中取值;

            當(dāng)變量值在本線程里改變時,會同時把變量的新值copy到該寄存器中,以便保持一致

            當(dāng)變量在因別的線程等而改變了值,該寄存器的值不會相應(yīng)改變,從而造成應(yīng)用程序讀取的值和實際的變量值不一致

            當(dāng)該寄存器在因別的線程等而改變了值,原變量的值不會改變,從而造成應(yīng)用程序讀取的值和實際的變量值不一致  


            舉一個不太準確的例子:  

            發(fā)薪資時,會計每次都把員工叫來登記他們的銀行卡號;一次會計為了省事,沒有即時登記,用了以前登記的銀行卡號;剛好一個員工的銀行卡丟了,已掛失該銀行卡號;從而造成該員工領(lǐng)不到工資  

            員工 -- 原始變量地址  
            銀行卡號 -- 原始變量在寄存器的備份  


            2. 在什么情況下會出現(xiàn)(如1樓所說)

                1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)  
                2). 一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables)  
                3). 多線程應(yīng)用中被幾個任務(wù)共享的變量  
                

            補充: volatile應(yīng)該解釋為“直接存取原始內(nèi)存地址”比較合適,“易變的”這種解釋簡直有點誤導(dǎo)人;  

            “易變”是因為外在因素引起的,象多線程,中斷等,并不是因為用volatile修飾了的變量就是“易變”了,假如沒有外因,即使用volatile定義,它也不會變化;

            而用volatile定義之后,其實這個變量就不會因外因而變化了,可以放心使用了; 大家看看前面那種解釋(易變的)是不是在誤導(dǎo)人


            ------------簡明示例如下:-----------------

            volatile關(guān)鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改,比如:操作系統(tǒng)、硬件或者其它線程等。遇到這個關(guān)鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優(yōu)化,從而可以提供對特殊地址的穩(wěn)定訪問。
            使用該關(guān)鍵字的例子如下:
            int volatile nVint;
            >>>>當(dāng)要求使用volatile 聲明的變量的值的時候,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)。而且讀取的數(shù)據(jù)立刻被保存。
            例如:
            volatile int i=10;
            int a = i;
            ...
            //其他代碼,并未明確告訴編譯器,對i進行過操作
            int b = i;
            >>>>volatile 指出 i是隨時可能發(fā)生變化的,每次使用它的時候必須從i的地址中讀取,因而編譯器生成的匯編代碼會重新從i的地址讀取數(shù)據(jù)放在b中。而優(yōu)化做法是,由于編譯器發(fā)現(xiàn)兩次從i讀數(shù)據(jù)的代碼之間的代碼沒有對i進行過操作,它會自動把上次讀的數(shù)據(jù)放在b中。而不是重新從i里面讀。這樣以來,如果i是一個寄存器變量或者表示一個端口數(shù)據(jù)就容易出錯,所以說volatile可以保證對特殊地址的穩(wěn)定訪問。
            >>>>注意,在vc6中,一般調(diào)試模式?jīng)]有進行代碼優(yōu)化,所以這個關(guān)鍵字的作用看不出來。下面通過插入?yún)R編代碼,測試有無volatile關(guān)鍵字,對程序最終代碼的影響:
            >>>>首先,用classwizard建一個win32 console工程,插入一個voltest.cpp文件,輸入下面的代碼:
            >>
            #i nclude <stdio.h>
            void main()
            {
            int i=10;
            int a = i;
            printf("i= %d",a);
            //下面匯編語句的作用就是改變內(nèi)存中i的值,但是又不讓編譯器知道
            __asm {
            mov dword ptr [ebp-4], 20h
            }
            int b = i;
            printf("i= %d",b);
            }      
            然后,在調(diào)試版本模式運行程序,輸出結(jié)果如下:
            i = 10
            i = 32
            然后,在release版本模式運行程序,輸出結(jié)果如下:
            i = 10
            i = 10
            輸出的結(jié)果明顯表明,release模式下,編譯器對代碼進行了優(yōu)化,第二次沒有輸出正確的i值。下面,我們把 i的聲明加上volatile關(guān)鍵字,看看有什么變化:
            #i nclude <stdio.h>
            void main()
            {
            volatile int i=10;
            int a = i;
            printf("i= %d",a);
            __asm {
            mov dword ptr [ebp-4], 20h
            }
            int b = i;
            printf("i= %d",b);
            }      
            分別在調(diào)試版本和release版本運行程序,輸出都是:
            i = 10
            i = 32
            這說明這個關(guān)鍵字發(fā)揮了它的作用!

            -----------------------------------


            volatile對應(yīng)的變量可能在你的程序本身不知道的情況下發(fā)生改變
            比如多線程的程序,共同訪問的內(nèi)存當(dāng)中,多個程序都可以操縱這個變量
            你自己的程序,是無法判定合適這個變量會發(fā)生變化
            還比如,他和一個外部設(shè)備的某個狀態(tài)對應(yīng),當(dāng)外部設(shè)備發(fā)生操作的時候,通過驅(qū)動程序和中斷事件,系統(tǒng)改變了這個變量的數(shù)值,而你的程序并不知道。
            對于volatile類型的變量,系統(tǒng)每次用到他的時候都是直接從對應(yīng)的內(nèi)存當(dāng)中提取,而不會利用cache當(dāng)中的原有數(shù)值,以適應(yīng)它的未知何時會發(fā)生的變化,系統(tǒng)對這種變量的處理不會做優(yōu)化——顯然也是因為它的數(shù)值隨時都可能變化的情況。

            --------------------------------------------------------------------------------

            典型的例子
            for ( int i=0; i<100000; i++);
            這個語句用來測試空循環(huán)的速度的
            但是編譯器肯定要把它優(yōu)化掉,根本就不執(zhí)行
            如果你寫成  
            for ( volatile int i=0; i<100000; i++);
            它就會執(zhí)行了

            volatile的本意是“易變的”  
            由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優(yōu)化。比如:

            static int i=0;

            int main(void)
            {
            ...
            while (1)
            {
            if (i) dosomething();
            }
            }

            /* Interrupt service routine. */
            void ISR_2(void)
            {
            i=1;
            }

            程序的本意是希望ISR_2中斷產(chǎn)生時,在main當(dāng)中調(diào)用dosomething函數(shù),但是,由于編譯器判斷在main函數(shù)里面沒有修改過i,因此
            可能只執(zhí)行一次對從i到某寄存器的讀操作,然后每次if判斷都只使用這個寄存器里面的“i副本”,導(dǎo)致dosomething永遠也不會被
            調(diào)用。如果將將變量加上volatile修飾,則編譯器保證對此變量的讀寫操作都不會被優(yōu)化(肯定執(zhí)行)。此例中i也應(yīng)該如此說明。

            一般說來,volatile用在如下的幾個地方:

            1、中斷服務(wù)程序中修改的供其它程序檢測的變量需要加volatile;

            2、多任務(wù)環(huán)境下各任務(wù)間共享的標志應(yīng)該加volatile;

            3、存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義;

            另外,以上這幾種情況經(jīng)常還要同時考慮數(shù)據(jù)的完整性(相互關(guān)聯(lián)的幾個標志讀了一半被打斷了重寫),在1中可以通過關(guān)中斷來實
            現(xiàn),2中可以禁止任務(wù)調(diào)度,3中則只能依靠硬件的良好設(shè)計了。
            posted @ 2008-07-27 21:56 halCode 閱讀(331) | 評論 (0)編輯 收藏
            ???諸位,咱當(dāng)電子工程師也是十余年了,不算有出息,環(huán)顧四周,也沒有看見幾個有出息的!回顧工程師生涯,感慨萬千,愿意講幾句掏心窩子的話,也算給咱們師弟師妹們提個醒,希望他們比咱們強!
            ?
            [1]好好規(guī)劃自己的路,不要跟著感覺走!根據(jù)個人的理想決策安排,絕大部分人并不指望成為什么院士或教授,而是希望活得滋潤一些,爽一些。那么,就需要慎重安排自己的軌跡。從哪個行業(yè)入手,逐漸對該行業(yè)深入了解,不要頻繁跳槽,特別是不要為了一點工資而轉(zhuǎn)移陣地,從長遠看,這點錢根本不算什么,當(dāng)你對一個行業(yè)有那么幾年的體會,以后錢根本不是問題。頻繁地動蕩不是上策,最后你對哪個行業(yè)都沒有摸透,永遠是新手!
            ?
            [2]可以做技術(shù),切不可沉湎于技術(shù)。千萬不可一門心思鉆研技術(shù)!給自己很大壓力,如果你的心思全部放在這上面,那么注定你將成為孔乙己一類的人物!適可而止為之,因為技術(shù)只不過是你今后前途的支柱之一,而且還不是最大的支柱。
            ?
            [3]不要去做技術(shù)高手,只去做綜合素質(zhì)高手!在企業(yè)里混,我們時常瞧不起某人,說他“什么都不懂,憑啥拿那么多錢,憑啥升官!”這是普遍的典型的工程師的迂腐之言。8051很牛嗎?人家能上去必然有他的本事,而且是你沒有的本事。你想想,老板搞經(jīng)營那么多年,難道見識不如你這個新兵?人家或許善于管理,善于領(lǐng)會老板意圖,善于部門協(xié)調(diào)等等。因此務(wù)必培養(yǎng)自己多方面的能力,包括管理,親和力,察言觀色能力,攻關(guān)能力等,要成為綜合素質(zhì)的高手,則前途無量,否則只能躲在角落看示波器!技術(shù)以外的技能才是更重要的本事!!從古到今,美國日本,一律如此!
            ?
            [4]多交社會三教九流的朋友!不要只和工程師交往,認為有共同語言,其實更重要的是和其他類人物交往,如果你希望有朝一日當(dāng)老板或高層管理,那么你整日面對的就是這些人。了解他們的經(jīng)歷,思維習(xí)慣,愛好,學(xué)習(xí)他們處理問題的模式,了解社會各個角落的現(xiàn)象和問題,這是以后發(fā)展的巨大的本錢。
            ?
            [6]抓住時機向技術(shù)管理或市場銷售方面的轉(zhuǎn)變!要想有前途就不能一直搞開發(fā),適當(dāng)時候要轉(zhuǎn)變?yōu)楣芾砘蜾N售,前途會更大,以前搞技術(shù)也沒有白搞,以后還用得著。搞管理可以培養(yǎng)自己的領(lǐng)導(dǎo)能力,搞銷售可以培養(yǎng)自己的市場概念和思維,同時為自己以后發(fā)展積累龐大的人脈!應(yīng)該說這才是前途的真正支柱!
            ?
            [7]逐漸克服自己的心里弱點和性格缺陷!多疑,敏感,天真(貶義,并不可愛),猶豫不決,膽怯,多慮,臉皮太薄,心不夠黑,教條式思維。。。這些工程師普遍存在的性格弱點必須改變!很難嗎?只在床上想一想當(dāng)然不可能,去幫朋友守一個月地攤,包準有效果,去實踐,而不要只想!不克服這些缺點,一切不可能,甚至連項目經(jīng)理都當(dāng)不好--盡管你可能技術(shù)不錯!
            ?
            [8]工作的同時要為以后做準備!建立自己的工作環(huán)境!及早為自己配置一個工作環(huán)境,裝備電腦,示波器(可以買個二手的),仿真器,編程器等,業(yè)余可以接點活,一方面接觸市場,培養(yǎng)市場感覺,同時也積累資金,更重要的是準備自己的產(chǎn)品,咱搞技術(shù)的沒有錢,只有技術(shù),技術(shù)的代表不是學(xué)歷和證書,而是產(chǎn)品,拿出象樣的產(chǎn)品,就可技術(shù)轉(zhuǎn)讓或與人合作搞企業(yè)!先把東西準備好,等待機會,否則,有了機會也抓不住!
            ?
            [9]要學(xué)會善于推銷自己!不僅要能干,還要能說,能寫,善于利用一切機會推銷自己,樹立自己的品牌形象,很必要!要創(chuàng)造條件讓別人了解自己,不然老板怎么知道你能干?外面的投資人怎么相信你?提早把自己推銷出去,機會自然會來找你!搞個個人主頁是個好注意!!特別是培養(yǎng)自己在行業(yè)的名氣,有了名氣,高薪機會自不在話下,更重要的是有合作的機會......

            [10]該出手時便出手!永遠不可能有100%把握!!!條件差不多就要大膽去干,去闖出自己的事業(yè),不要猶豫,不要彷徨,干了不一定成功,但至少為下一次沖擊積累了經(jīng)驗,不干永遠沒出息,而且要干成必然要經(jīng)歷失敗。不經(jīng)歷風(fēng)雨,怎么見彩虹,沒有人能隨隨便便成功!
            posted @ 2006-04-11 10:51 halCode 閱讀(538) | 評論 (2)編輯 收藏

            借用別人的流程圖提醒自己編程的步驟


            1.面向連接的套接字的系統(tǒng)調(diào)用時序圖



            無連接協(xié)議的套接字調(diào)用時序圖

            面向連接的應(yīng)用程序流程圖



            posted @ 2006-03-23 21:11 halCode 閱讀(6346) | 評論 (0)編輯 收藏
            大學(xué)生=吃飯+睡覺+談戀愛
            豬=吃飯+睡覺
            所以:大學(xué)生=豬+談戀愛
            以上推出 大學(xué)生-談戀愛=豬
            即 大學(xué)生不談戀愛的都是豬?
            同理得出 豬只要談戀愛就可以變成大學(xué)生
            posted @ 2006-03-21 10:34 halCode 閱讀(389) | 評論 (0)編輯 收藏

            李安獲最佳導(dǎo)演獎“首先要感謝很多在場和不在場的人,像制作人Ann Li,編劇Diana,Jack~~我覺得《斷背山》是屬于我李安一個人的,如果被其他人拍了,我將會很生氣!這部電影既不是關(guān)于同性戀,女人,愛情,而是愛的本身。
            謝謝大家的支持,謝謝我的妻子和兒子,我愛你們,我將永遠和你們同在。雖然在期間我的父親不幸過世,但是要感謝我家中的媽媽,還有中國臺灣,香港和內(nèi)地的同胞們。最后,謝謝大家的關(guān)心!”

            看到這段話時,我十分感動,尤其是“但是要感謝我家中的媽媽,還有中國臺灣,香港和內(nèi)地的同胞們。”體現(xiàn)了一種難得的親情,而且在拿到國際電影上最高榮譽的獎項時,不忘記自己是名中國人,不忘記把臺灣說成“中國臺灣”。

            然而我注意到這句話的表述有點怪怪的,是不是他自己的原話呢?我最不愿意懷疑的就是“中國臺灣”幾個字。于是我查看了sohu這段新聞下網(wǎng)友的評論,發(fā)現(xiàn)原文是這樣的:“And finally, to my mother and family, and everybody in Taiwan, Hong Kong and China. Thank you. ”,他說的是“臺灣、香港和中國”。。。。。

            盡管他是所有華人的驕傲,盡管也許他并沒有太在意他的表述,但是。。我多少還是有些失望的。。。。

            posted @ 2006-03-06 19:59 halCode 閱讀(692) | 評論 (0)編輯 收藏
            昨天寫了MoveWindow函數(shù),今天又要寫SetWindowPos函數(shù),因為MoveWindow確實不好,浪費了差不多一天時間。。。對于主窗口,選擇了Center屬性就可以移動位置,不選就不行;窗口資源過大也不能移動;改變后窗口的尺寸大于等于屏幕尺寸的話,在它上面DoModal出來的新窗口不能移動。。原來,使用MoveWindow移動對話框位置似乎有很苛刻的條件,一不小心就原地不動了,而且我也實在琢磨不透這樣的條件,網(wǎng)上也沒有查處來。今天用了SetWindowPos后,才發(fā)現(xiàn),果然好用!

            BOOL SetWindowPos(
               
            const CWnd* pWndInsertAfter,
               
            int x,
               
            int y,
               
            int cx,
               
            int cy,
               UINT nFlags 
            );

            Parameters

            pWndInsertAfter
            Identifies the CWnd object that will precede this CWnd object in the Z-order. This parameter can be a pointer to a CWnd or a Pointer to one of the following values:
            • wndBottom   Places the window at the bottom of the Z-order. If this CWnd is a topmost window, the window loses its topmost status; the system places the window at the bottom of all other windows.
            • wndTop   Places the window at the top of the Z-order.
            • wndTopMost   Places the window above all nontopmost windows. The window maintains its topmost position even when it is deactivated.
            • wndNoTopMost   Repositions the window to the top of all nontopmost windows (that is, behind all topmost windows). This flag has no effect if the window is already a nontopmost window.
            nFlags
            Specifies sizing and positioning options. This parameter can be a combination of the following: 常用的是SWP_SHOWWINDOW

            注意:
                這里的坐標參數(shù)用的是Client坐標,對于子窗口用的是其父窗口的坐標系。然而對于用DoModal()彈出的窗口,如果在資源屬性里沒有選擇Child屬性的話,它的父窗口是DeskTop,而不是調(diào)用DoModal()的窗口。

            posted @ 2006-03-01 17:30 halCode 閱讀(2728) | 評論 (0)編輯 收藏

            剛做的那個軟件界面很重要,就象是把自己做的一個個控件網(wǎng)上畫一樣,還要按照實際運行效果來不斷調(diào)整位置,很麻煩。當(dāng)時使用MoveWindow()這個函數(shù)來控制對話框的大小和位置,不了解參數(shù)情況,在網(wǎng)上查了,記得好象放在這里備忘,那時還覺得blog真是方便。結(jié)果現(xiàn)在又要用起這個函數(shù)卻又找不到了!不知道是不是放在這個blog里了。看來blog多了還不方便了。不過不要誤會,那些都是以前找到這個blog之前暫時用的,都不太滿意。最后覺得還是這里好,hoho,方便。暈,我來寫這篇日志是干嗎的?這么扯到這么遠了。。。不說了,還是把MoveWindow()再貼一下吧。。

            BOOL MoveWindow
            (   HWND hWnd,      
            //Handle to the window
                int X,                      //Specifies the new position of the left side of the window.
                int Y,                      //Specifies the new position of the top of the window.
                int nWidth,
                
            int nHeight,
                BOOL bRepaint
            );

            這個是 API函數(shù),如果在MFC中使用CWnd::MoveWindow則不需要第一個參數(shù)句柄hWnd,其他相同。
            posted @ 2006-02-28 15:44 halCode 閱讀(2899) | 評論 (0)編輯 收藏
            成功的人要具備:有肚量去容忍那些不能改變的事,有勇氣去改變那些可能改變的事,有智慧去區(qū)別上述兩類事。
            posted @ 2005-12-29 14:17 halCode 閱讀(334) | 評論 (0)編輯 收藏
            有些東西在你沒有遇到之前還真是不知道自己沒有弄清楚,也許是我平時細節(jié)的地方注意少了,看來以后要多加注意了。

            char *pStr;
            char ch;
            char str[] = "Hello";

            ch 
            = str[1];
            *pStr = str[1];

            printf(
            "ch = %c\n", ch);
            printf(
            "*pStr = %c"*pStr);

            此時打印ch值的時候能正確輸出,但是打印pStr[0]的時候就出問題了,跟蹤發(fā)現(xiàn)是pStr[0] = str[1];這句出現(xiàn)問題。

            原來,char *pStr; 只定義了一個4字節(jié)的指針變量,而這個變量里面的內(nèi)容是將要指向一個char類型變量的,但是此時pStr只是個“野指針”,并沒有指向一個char類型的內(nèi)存單元,所以,當(dāng)用*pStr來訪問這個元素時,系統(tǒng)根本不知道該訪問何處的空間,因此,在使用pStr前,必須讓它指向一個具體的空間。

            由上面可以將相關(guān)語句改為
            char *pStr;
            char ch;
            char str[] = "Hello";

            pStr 
            = &ch;    //pStr指向ch、獲得初始化
            pStr = &str[1];  //pStr指向str[1]地址、獲得初始化
            ch = str[1];
            *pStr = str[1];

            printf(
            "ch = %c\n", ch);
            printf(
            "*pStr = %c"*pStr);
            也就是說,要先給指針一個地址值初始化它,然后才能用*訪問它指向的內(nèi)容。



            ◎另外,在子函數(shù)中使用malloc()/new()分配的內(nèi)存空間不會因子函數(shù)的返回而消失,函數(shù)只會清理調(diào)子函數(shù)里定義的變量的空間,如:
            char* func()
            {
              
            char *p;
              p 
            = (char *)malloc(sizeof(char));
              
              
            return p;
            }
              //返回后,p所在空間被釋放,但是p所指空間還存在
            所以,可以用p1=func();來獲得在func()中分配的空間。

            此中方法可以用來解決“指針的指針”使用不方便的問題。步驟分2步:1、把傳入的指針的指針參數(shù)去掉;2、把函數(shù)的返回值賦給要改變的對象的指針:
            void GetMemory2(char **p, int num)
            {
              
            *= (char *)malloc(sizeof(char* num);
            }

            void Test2(void)
            {
              
            char *str = NULL;
              GetMemory2(
            &str, 100);   // 注意參數(shù)是 &str,而不是str
              strcpy(str, "hello");    
              cout
            << str << endl;
              free(str);    
            }


            //////下面是用傳遞動態(tài)內(nèi)存的方法實現(xiàn)
            char *GetMemory3(int num)
            {
              
            char *= (char *)malloc(sizeof(char* num);
              
            return p;
            }

            void Test3(void)
            {
              
            char *str = NULL;
              str 
            = GetMemory3(100);    
              strcpy(str, 
            "hello");
              cout
            << str << endl;
              free(str);    
            }

            因為此時用malloc/new分配的內(nèi)存空間是堆里面的,函數(shù)返回時不會回收;而如果在子函數(shù)中用char p[]="asdfgewq";則p是在棧中定義的(先分配p的空間,然后講字符串拷貝進去,跟char *p="asdfasdf"分配在全局靜態(tài)內(nèi)存中不一樣),所以會被系統(tǒng)收回。
            posted @ 2005-12-21 10:55 halCode 閱讀(574) | 評論 (0)編輯 收藏
            1。定義數(shù)組變量時必須指定數(shù)組元素個數(shù),因為系統(tǒng)會根據(jù)元素個數(shù)在編譯時一次性分配這么多內(nèi)存;
                  而指針變量只需要指定類型,系統(tǒng)只為該指針變量分配4字節(jié)(32位機)內(nèi)存,而不會為該變量所指內(nèi)容分配內(nèi)存。

            2。指針變量是有存儲空間的;而數(shù)組名僅僅是一個標號,沒有實際存儲空間,單單一個數(shù)組名就只能表示該數(shù)組的第1個元素的地址。int a[10]; 規(guī)定&a就等于&a[0]或者a .

            3。例如 char str[]= "hello world"和char *p = "hello world"中,數(shù)組str是先分配給他元素個數(shù)個內(nèi)存,然后將后面的字符串復(fù)制給這個空間(注意,此時應(yīng)該考慮\0字符);而p的建立過程是先在靜態(tài)存儲區(qū)建立常字符串"hello world\0",然后將p指向這個常字符串。所以數(shù)組str中元素的內(nèi)容可以通過重新賦值改變,而p指向的內(nèi)容不能改變。
            posted @ 2005-12-18 21:40 halCode 閱讀(572) | 評論 (0)編輯 收藏
            僅列出標題  下一頁

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(7)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            相冊

            編程資源

            不務(wù)正業(yè)

            找工作

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产半推半就| 久久久久亚洲AV成人网| 久久中文骚妇内射| 97久久精品午夜一区二区| 亚洲一区二区三区日本久久九| 精品欧美一区二区三区久久久| 久久久国产99久久国产一| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 国产成人无码精品久久久免费| 久久av高潮av无码av喷吹| 99久久精品国产一区二区| 久久se精品一区精品二区国产| 久久水蜜桃亚洲av无码精品麻豆| 久久国产精品国语对白| 久久精品国产亚洲AV嫖农村妇女| 久久狠狠一本精品综合网| 久久99精品久久久久子伦| 久久婷婷午色综合夜啪| 久久国产免费直播| 亚洲国产精久久久久久久| 久久免费的精品国产V∧| 亚洲综合久久夜AV | 成人午夜精品久久久久久久小说 | 亚洲伊人久久成综合人影院 | 久久福利青草精品资源站| 久久婷婷国产剧情内射白浆| 久久高潮一级毛片免费| 久久午夜电影网| 99久久er这里只有精品18| 2021国内久久精品| 久久天天躁夜夜躁狠狠躁2022| 久久国产影院| 无夜精品久久久久久| 久久综合视频网站| 亚洲国产成人乱码精品女人久久久不卡 | 久久午夜电影网| 亚洲国产成人久久精品影视| 久久国产精品一区二区| 精品国产乱码久久久久久1区2区 | 99久久精品免费看国产一区二区三区| 日韩欧美亚洲国产精品字幕久久久|