• <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>

            life02

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              197 隨筆 :: 3 文章 :: 37 評論 :: 0 Trackbacks

            #

            [此帖已被設為精華] 轉載

            發信站: 北郵人論壇 (Tue Oct 20 16:52:13 2009), 站內

                 先簡單介紹一下本人,本人小碩,信通院通信與信息系統,無線方向,投的百度無線新技術研發,技術崗。雖然在實驗室做過一些項目,但也都是無線通信的底層開發,和互聯網沒有任何關系。。。
               今早尚未睡醒,突然一陣手機鈴聲傳來,一個陌生的手機號碼,見其不是響一聲電話,遂接之,在不算清楚的狀態下被通知下午一點普天大廈百度面試,突如其來的通知搞的我有點措手不及。本來覺得18號筆試完直接被鄙視了,這從天而降的機會還是迫使我需要在短時間內做好必要的準備,所謂的準備也就是從網上查查面經,復習復習筆試題目,總之還是抱著學習的態度去的,沒抱太大希望。
               下午12點40到達普天大廈,簽到后稍微等了一會兒,接待我的jj將我指到一個小型的廣場,陽光很好,有很多小圓桌,我的面試官已經坐在其中一個小圓桌上等我了,是一對一的面試,坐下后簡單打了個招呼,面試就開始了,先是按照我的簡歷問我關于最近一個項目的相關內容,包括項目組的職責,做過什么,貢獻在哪,碰到過什么難題等等,因為面試官gg估計也不太懂我做過的東西,我就blabla一頓介紹,然后又問我學的課程中認為哪個比較困難,困難在哪,有沒有具體例子,總之問的比較細。我覺得在這個環節最重要的就是讓面試官覺得項目是你做的,有的可講,對于自己的貢獻的部分講的越細越好,對方聽沒聽懂沒有關系,關鍵在于能夠有條理的回答對方問的問題(當然,如果對方對自己做過的項目非常了解,回答問題的時候就應該盡量謹慎,不要扯淡,以免露怯。。。)
               之后的環節是算法,數據結構,編程題,由面試官現場出題,他先出了兩個比較簡單的題目,一個是 char str ="hello";sizeof(str)和strlen(str)為多少,還有一個是floata;將其和0做比較的if語句如何編寫。然后出了一個數據結構算法實現題:給定二叉樹,寫出計算該二叉樹的高度的函數,這題我沒想出來。。。他又出了一個:給定二叉樹,寫出拷貝該二叉樹的函數,返回拷貝后根節點值,這道題我只說出了大概的思路,看面試官的表情,不是很滿意。。。隨后又問了關于二叉樹深度優先和廣度優先的算法問題,和堆排序的算法問題,無奈專業背景相差過大,這些我都沒答上來,對于學計算機的學生,我覺得這些問題應該都不難。。。最后又給我出了道關于字符串的問題:給定字符串,內容為a-z的字符,其中有一個字符出現為奇數次,其他均為偶數次,找出出現奇數次的字符,我簡單給出了一個算法,但是時間復雜度過高,于是面試官gg問我能不能對算法進行優化,這個又難住我了,雖然面試官gg人很好,在我想的過程中一直給予提示,無奈我水平不夠。。。想出來的答案都相去甚遠。。。我覺得這個環節本身考察的問題其實并不難,都是基礎,換一個學計算機的學生,這些東西不過是平時的功課罷了,只要算法,數據結構的基礎知識過硬,回答這些問題應該都不會很困難
               距離面試結束還有幾分鐘的時候,和面試官gg簡單聊了聊,獲知對方是南開計算機畢業的,告訴我互聯網行業技術崗主要要求的素質包括算法和數據結構,網絡的基本知識,編程能力等等,期間還說了一些我沒太明白的專有名詞,總之,他覺得以我現在的知識儲備和項目經歷,目前還不太適合這個職位。。。
                一個小時后,面試結束,本來我也是抱著學習的心態過來試試,對于這樣的結果我還是預想的到的,這一趟面試也算沒有白來,能夠學到一些東西我就知足了。希望大家都能找到好工作,共勉!
            轉載請注明出自應屆生求職招聘論壇 http://bbs.yingjiesheng.com/,本貼地址:http://bbs.yingjiesheng.com/thread-253544-1-1.html

             

             

            posted @ 2009-10-23 14:56 life02 閱讀(388) | 評論 (0)編輯 收藏

            1 計算 a^b << 2 (運算符優先級問題)
            int a = 2;
            int b = 1;
            int c = 2;
            cout << (a ^ b << c);
            6
            2 根據先序中序求后序

            3 a[3][4]哪個不能表示 a[1][1]: *(&a[0][0]) *(*(a+1)+1) *(&a[1]+1) *(&a[0][0]+4)
            cout << *(&a[1][1]) << endl
                   <<*(*(a+1)+1) << endl
                   << *(&a[1]+1) << endl
                   << *(&a[0][0]+4);
            6
            6
            0012FEC8
            5
            4 for(int i...)
                for(int j...)
                  printf(i,j);
                  printf(j)
            會出現什么問題
            J沒有定義,不在其作用域
            5 for(i=0;i<10;++i,sum+=i);的運行結果
                int i, sum = 0;
            for(i=0;i<10;++i,sum+=i);
            cout << sum;
            55
            6 10個數順序插入查找二叉樹,元素62的比較次數

            7 10個數放入模10hash鏈表,最大長度是多少

            8 fun((exp1,exp2),(exp3,exp4,exp5))有幾個實參
            2個,逗號運算符,
            9 希爾 冒泡 快速 插入 哪個平均速度最快

            10 二分查找是 順序存儲 鏈存儲 按value有序中的哪些

            11 順序查找的平均時間

            12 *p=NULL *p=new char[100] sizeof(p)各為多少
            都是4
            13 頻繁的插入刪除操作使用什么結構比較合適,鏈表還是數組
            鏈表
            14 enum的聲明方式
            enum A{
            a1,
            a2,
            a3,
            };
            15 1-20的兩個數把和告訴A,積告訴B,A說不知道是多少,
            B也說不知道,這時A說我知道了,B接著說我也知道了,問這兩個數是多少


            大題:

            1 把字符串轉換為小寫,不成功返回NULL,成功返回新串

            char* toLower(char* sSrcStr)
            {
                char* sDest= NULL;
                if( __1___)
                {
                    int j;
                    sLen = strlen(sSrcStr);
                    sDest = new [_______2_____];
                    if(*sDest == NULL)
                        return NULL;
                    sDest[sLen] = '\0';
                    while(_____3____)
                       sDest[sLen] = toLowerChar(sSrcStr[sLen]);
                }
                return sDest;
            }
            char toLowerChar(char a)
            {
                if(a >= 'A' && a <= 'Z')
                   return a - 'A' + 'a';
            }

            char* toLower(char* sSrcStr)
            {
                char* sDest= NULL;
                if(sSrcStr)
                {
                   int j;
                   int sLen = strlen(sSrcStr);
                   sDest = new char[sLen + 1];
                   if(*sDest == NULL)
                       return NULL;
                   sDest[sLen] = '\0';
                   while(sLen--)
                       sDest[sLen] = toLowerChar(sSrcStr[sLen]);
                }
                return sDest;
            }

            2 把字符串轉換為整數 例如:"-123" -> -123

            main()
            {
                .....
                if( *string == '-' )
                    n = ____1______; -1* num(string+1)
                else
                    n = num(string);
                .....
            }

            int num(char* string)
            {
                for(;!(*string==0);string++)
                {
                    int k;
                    k = __2_____; *string
                    j = --sLen;
                    while( __3__) j--
                        k = k * 10;
                    num = num + k;
                }
                return num;
            }

            附加題:

            1 linux下調試core的命令,察看堆棧狀態命令

            2 寫出socks套接字 服務端 客戶端 通訊程序

            3 填空補全程序,按照我的理解是添入:win32調入dll的函數名
            查找函數入口的函數名 找到函數的調用形式
            把formView加到singledoc的聲明 將singledoc加到app的聲明

            4 有關系 s(sno,sname) c(cno,cname) sc(sno,cno,grade)
            1 問上課程 "db"的學生no
            2 成績最高的學生號
            3 每科大于90分的人數

            2005年騰訊招聘
            選擇題(60)
            c/c++ os linux 方面的基礎知識 c的Sizeof函數有好幾個!
            程序填空(40)
            1.(20) 4空x5
            不使用額外空間,將 A,B兩鏈表的元素交叉歸并
            2.(20) 4空x5
            MFC 將樹序列化 轉存在數組或 鏈表中!

            發信人: ChinaOfey (勇敢的傻,傻得勇敢), 信區: Career_Plaza
            標 題: 騰訊筆試題
            發信站: 水木社區 (Sat Nov 5 16:25:25 2005), 站內

            希望明年的兄弟有用!(B卷)

            第一部分:基本都是數據結構題+1,2道操作系統和數據庫相關的(比較基本)

            有印象的:

            1,為節省空間,兩個棧共用一個空間,棧底在兩邊,問什么時候表明空間用完
                答案:棧頂相遇時
                這道題就是很基礎的一個題目,因為是第一道題,所以印象比較深^_^

            2,char A[5]; char* B ="abcdefg"; void * C; C = new char[100];
                sizeof(A) sizeof(B) size(C)
            5,4,4
            3,爸爸,媽媽,妹妹,小強,至少兩個人同一生肖的概率是多少
                1- 12*11*10*9/12*12*12*12 = 43% ,我忘用1減了....

            然后還有幾個看程序給結果的題,考察了類,指針的內容

            第二部分:程序填空

               主要要能看出他的思路

            第三部分:寫代碼

               1,關于mfc的,一個控件,顯示時間,1s鐘刷新一次

               2,SQL語言進行簡單的數據庫操作,建表,查詢,求平均工資等

                 不記得語言了,因此只好自創....ft

               3,Unix進程通信有哪些方式,各有什么特點?

               (其中A卷給的是道網絡編程題目)

            第四部分:主觀題

            考rp的,比較無聊,手都寫酸了....

            程序4說明]
            設 M 叉樹采用列表法表示,即每棵子樹對應一個列表,列表的結構為:子樹根結點的值部分
            (設為一個字符) 和用“( )”,括起來的各子樹的列表 (如有子樹的話) ,各子列表間用“
            ,”,分隔。例如下面的三叉樹可用列表 a( b( c,d ),e,f( g,h,i ))表示。
             

            本程序輸入列表,生成一棵 M 叉樹,并由 M 叉樹輸出列表。假定輸入無錯誤。
            [程序4]
            #include〈stdio.h〉
            #include〈stdlib.h〉
            #define M 3
            typedef struct node{ char val;
            struct node *subTree[M];
            } NODE;
            char buf[255] ,*str = buf
            NODE *d = NULL
            NODE *mackTree( ) /*由列表生成M叉樹*/
            { int k; NODE *s ;
            s = __(1)__
            s -> val = *str++ ;
            for ( k = 0 ; k < M ; k++ ) s-> subTree[k] = NULL ;
            if(*str='( '){
            k = 0;
            do { str++;
            s -> subTree[k] = __(2)__ ;
            if ( *str == ')' ) { str++; break ; }
            k = k+l ;
            } while ( __(3)__ );
            }
            return s ;
            }
            void walkTree( NODE *t ) /*由 M 叉樹輸出列表*/
            { int i ;
            if( t != NULL ) {
            __(4)__
            if ( t -> subTree[0] == NULL ) return ;
            putchar ( '( ' ) ;
            for ( i = 0 ; i < m ; i++) {
            __(5)__
            if ( i! = M - l && t -> subTree[i+l] != NULL )
            putchar ( ', ' ) ;
            }
            putchar ( ') ' ) ;
            }
            }
             
            void main( )
            { printf( "Enter exp:" ) ;
            scanf( "%S" , str ) ;
            d = makeTree() ;
            walkTree( d ) ; putchar( '\n') ;
            }
            有兩個集合  
            集合A{1,7,19,21,55,100。。。}  
            集合B{7,22,100。。。}  
            兩個集合都是10萬個數據(已排序),要求寫一個算法,判斷B是不是A的子集,算法時間復雜度為Q(N)
            posted @ 2009-10-19 21:59 life02 閱讀(396) | 評論 (1)編輯 收藏

            今天上午在南大,做了阿里巴巴的技術題,我兩份都做了,下面把其中C++相關的題回憶了一部分起來,希望對大家有幫助啊,
            為了給大家省點錢,我就直接粘貼在頁面上啦,描述不全的,大家諒解啊

            1.Stuct Foo{
            Foo(){}
            Foo(int){}
            Void fun(){}
            };

            int main (){
            Foo a(10);
            (1)
            a.fun();
            (2)
            Foo b();
            (3)
            b.fun();
            (4)
            }
            上面的程序中哪個語句是錯誤的;

            2.struct 和 class 的區別;

            3.const char*p1=”hello”;

            Char *const p2=”world”;
            下面哪些操作是合法的:(1)p1++;
            (2)*p1=”w”;
            (3)p2++;
            (4)*p2=”h”;

            4.n進制下。567*456=150216成立,則n的值是多少?

            5.C++中不能重載的運算符是?

            6.排序方法中元素比較次數與初始化排序無關的是哪種排序方法。

            7. int x[4]={0}; int y[4]={1};則x,y的值是多少?

            8.二分查找的理論

            9.采取FIFO頁面淘汰算法,如何計算缺頁。

            10.順序棧的容量如何計算

            11.文件索引結構

            12.搜索所用的數據結構的內存,以及速度的問題

            13.堆中的數據的存儲機制

            14.頁式存儲系統,如何計算分塊的大小

            15.std::vector::iterator
            可重載的運算符是哪些: ++,>>, *(前置), ==

            16.判斷單向鏈表是否存在環的最佳方案是什么?

            17.100張多米諾骨牌1,2,3 ……100,第一次先把所有的基數位置的牌拿掉,第二次把剩下的基數位置的牌拿掉,依此類推,最后剩下的牌是哪個:(A)32,(B)64,(C)88,(D)96

            18.在C++中不能重載下面的哪個運算符:(A)*
            (B) ?:
            (C) ::
            (D) delete

            19.就是指針的一大堆問題啦,什么函數指針啊,數組指針之類的

            20. sizeof() 計算問題

            21. public,protected在派生或者繼承之后的訪問權的問題
            轉載請注明出自應屆生求職招聘論壇 http://bbs.yingjiesheng.com/,本貼地址:http://bbs.yingjiesheng.com/thread-239002-1-1.html

             

             

            posted @ 2009-10-18 21:28 life02 閱讀(1721) | 評論 (1)編輯 收藏

            作者:baihacker
            來源:http://hi.baidu.com/feixue http://hi.csdn.net/baihacker

            問題描述:
            12個高矮不同的人,排成兩排,每排必須是從矮到高排列,而且第二排比對應的第一排的人高,問排列方式有多少種?
            這個筆試題,很YD,因為把某個遞歸關系隱藏得很深.

            問題分析:
            我們先把這12個人從低到高排列,然后,選擇6個人排在第一排,那么剩下的6個肯定是在第二排.
            用0表示對應的人在第一排,用1表示對應的人在第二排,那么含有6個0,6個1的序列,就對應一種方案.
            比如000000111111就對應著
            第一排:0 1 2 3 4 5
            第二排:6 7 8 9 10 11
            010101010101就對應著
            第一排:0 2 4 6 8 10
            第二排:1 3 5 7 9 11
            問題轉換為,這樣的滿足條件的01序列有多少個.
            觀察1的出現,我們考慮這一個出現能不能放在第二排,顯然,在這個1之前出現的那些0,1對應的人
            要么是在這個1左邊,要么是在這個1前面.而肯定要有一個0的,在這個1前面,統計在這個1之前的0和1的個數.
            也就是要求,0的個數大于1的個數.
            OK,問題已經解決.
            如果把0看成入棧操作,1看成出棧操作,就是說給定6個元素,合法的入棧出棧序列有多少個.
            這就是catalan數,這里只是用于棧,等價地描述還有,二叉樹的枚舉,多邊形分成三角形的個數,圓括弧插入公式中的
            方法數,其通項是c(2n, n)/(n+1).

            在 < <計算機程序設計藝術>>,第三版,Donald E.Knuth著,蘇運霖譯,第一卷,508頁,給出了證明:
            問題大意是用S表示入棧,X表示出棧,那么合法的序列有多少個(S的個數為n)
            顯然有c(2n, n)個含S,X各n個的序列,剩下的是計算不允許的序列數(它包含正確個數的S和X,但是違背其它條件).
            在任何不允許的序列中,定出使得X的個數超過S的個數的第一個X的位置.然后在導致并包括這個X的部分序列中,以
            S代替所有的X并以X代表所有的S.結果是一個有(n+1)個S和(n-1)個X的序列.反過來,對一垢一種類型的每個序列,我們都能
            逆轉這個過程,而且找出導致它的前一種類型的不允許序列.例如XXSXSSSXXSSS必然來自SSXSXXXXXSSS.這個對應說明,不允許
            的序列的個數是c(2n, n-1),因此an = c(2n, n) - c(2n, n-1).[Comptes Rendus Acad.Sci.105(Paris, 1887), 436~437]

            驗證:
            其中F表示前排,B表示后排,在枚舉出前排的人之后,對應的就是后排的人了,然后再驗證是不是滿足后面的比前面對應的人高的要求.
            C/C++ code
            #include <iostream> using namespace std; int bit_cnt(int n) { int result = 0; for (; n; n &= n-1, ++result); return result; } int main() { int F[6], B[6]; int ans = 0; for (int state = 0; state < (1 << 12); ++state) if (bit_cnt(state) == 6) { int i = 0, j = 0; for (int k = 0; k < 12; ++k) if (state&(1<<k)) F[i++] = k; else B[j++] = k; int ok = 1; for (int k = 0; k < 6; ++k) if (B[k] < F[k]) {ok = 0; break;} ans += ok; } cout << ans << endl; return 0; }
            結果:132
            而c(12, 6)/7 = 12*11*10*9*8*7/(7*6*5*4*3*2) = 132
            注意:c(2n, n)/(n+1) = c(2n, n) - c(2n, n-1)

            估計出題的人也讀過 < <計算機程序藝術>>吧.

            PS:
            另一個很YD的問題:
            有編號為1到n(n可以很大,不妨在這里假定可以達到10億)的若干個格子,從左到右排列.
            在某些格子中有一個棋子,不妨設第xi格有棋子(1 <=i <=k, 1 <=k <=n)
            每次一個人可以把一個棋子往左移若干步,
            但是不能跨越其它棋子,也要保證每個格子至多只有一個棋子.
            兩個人輪流移動,移動不了的為輸,問先手是不是有必勝策略.
            posted @ 2009-10-17 22:18 life02 閱讀(410) | 評論 (1)編輯 收藏

            1. 匹配"[10]:dddddd"和"[9]:abcdegf"但不匹配"[a]:xfdf"的正則表達式。

            2. int a[5]={1,2,3,4,5};

                printf("%d\n", *((int*)(&a+1)-2);

                輸出是什么。

                答:4.    分析:(int*)(&a+1)=a+5=&a[5]

            編程題:

            1. 給定一個int型數組array[n],寫一個函數sort(int array[], int n),n為數組長度。使得數組中不大于零的元素在前,大于零的元素在后,要求時間復雜度O(n)。

            2. 有1001個球。甲乙兩人交替取球,每次可取1、2、4個球,誰拿到最后一個球就算輸。如果甲先拿,問他有沒有必勝的把握?為什么?

               答:有。

                      第一次甲拿1個球,以后每次:

                      i. 乙拿1個,甲拿2個;

                     ii. 乙拿2個,甲拿1個或4個;

                     iii. 乙拿4個,甲拿2個。

                     最后肯定剩一個,并輪到乙拿。

            3. 實現atoi()和itoa()

            4. 給定一個int型數n,寫一個盡可能簡單的函數判斷n是否為2的冪,不能用循環。

               答:bool foo(int n)

                      {

                            int a=n;

                           if(n<=0) return false;

                           a=((a&0xAAAAAAAA)>>1)+(a&0x55555555);

                           a=((a&0xCCCCCCCC)>>2)+(a&0x33333333);

                           a=((a&0xF0F0F0F0)>>4)+(a&0x0F0F0F0F);

                           a=((a&0xFF00FF00)>>8)+(a&0x00FF00FF);

                           a=((a&0xFFFF0000)>>16)+(a&0x0000FFFF);

                           if(a==1) return true;

                           else return false;

                       }

            簡答題:

            1. 哪些方法可以避免或減少鎖的使用?

            2. release版本的可執行程序為什么非常大?

            3. 使用C++賦值運算符應注意什么地方?

            4. strcpy()為什么會造成緩沖區溢出?可用哪個函數替代?

            5. 阻塞模式的recv在沒受到數據的情況下如何返回?(不能將socket修改為非阻塞)

            8. 有紅、綠、藍三色球分別3,2,1個。取任意兩個不同顏色的球都會使它們變成第三種顏色的兩個球。問最少取多少次,可使這些球都變成同一種顏色?

               答:無論多少次,都不可以使這些球變成同一種顏色,分析:

                     一、對于(R,R,R,G,G,B)即(3,2,1),有:

                            i.   (R,G) ---> (B,B,B,R,R,G)即(3,2,1)

                            ii. (R,B)   ---> (G,G,G,G,R,R)即(4,2)

                            iii. (G,B) ---> (R,R,R,R,R,G)即(5,1)

                      二、對于(G,G,G,G,R,R)即(4,2),有 :

                            i. (R,G) ---> (G,G,G,B,B,R)即(3,2,1)

                      三、對于(R,R,R,R,R,G)即(5,1)有 :

                            i. (R,G) ---> (R,R,R,R,B,B)即(4,2)

                      因此,只有三種狀態(3,2,1), (4,2)和(5,1),不可能出現(6,0)這種情況。   

            9. 哪些方法可讓一個進程僅有一個實例運行?

            10. exit()和_exit() 的區別。

            11. 紅黑樹比AVL樹的優勢在哪?

            12. 軟件開發過程包含哪些階段?各階段質量保證措施是什么?

            posted @ 2009-10-15 11:59 life02 閱讀(1881) | 評論 (4)編輯 收藏

            網易2007Hust游戲開發工程師筆試

            1.拼七巧板,還是比較有意思的(10分)

            2.判斷下列圖案中哪一個與其他三個不同。(10)

             


                   A                           B                            C                          D

            3.有一個隊列長一百米,有一個人從尾走到頭,再從頭走到尾,期間他的速度和隊列的速度都不變,隊列正好行進了100米,問這個人走了多少距離。(10)

             

            4.推理題。關于白帽、黑帽的,可以網上搜搜類似的。(10)

             

            5.一個文章系統,用戶登陸后輸出歡迎信息:(20)

            1.用戶注冊時間不足一個月,輸出信息A:歡迎新用戶,您還沒有發表文章,可以先熟悉一下系統,查看幫助信息。

            2.用戶注冊時間不足一個月,輸出信息B:歡迎新用戶,您已經發表了文章,不過在最初一個月發表3篇或3篇以上文章會對以后很有幫助。

            3.用戶注冊時間小于三個月,輸出信息C:用戶您好,在最初一個月后您沒有發表文章,請多多努力。

            4.用戶注冊大于三個月,輸出信息D:用戶您好,最近3個月您都未發表文章,如果長時間不發表文章,您的帳號將被凍結。

            5.其他情況輸出E:歡迎您的登陸。

             

            1)畫出流程圖

            2)寫出實現代碼,不需要定義變量類型

             

            相關函數

            GetRegisterTime(username)
             獲得用戶username的注冊時間
             
            GetNowTime()
             獲得現在時間
             
            TimeDiff(time1,time2)
             獲得time1到time2的天數
             
            AddDay(time1,day_num)
             在time1上加上天數,可以為負,得到新時間
             
            GetArticleCount(username,time1,time2)
             獲得用戶在time1和time2之間發表的文章數量
             
            Print(A)
             輸出信息A,可以將A換成B、C等等
             

            如有其他函數請自己定義并說明用途。

            6.計算概率,具體不記得了。(10)

            7.英文題目Next Number。(20)

            大意就是要根據輸入數字,輸出一個新數,要求輸出數字各個位的和加起來與原數相等。輸出的數字是大于原數的第一個數。

             

            如Input:113,output:122,Input 0050,output: 0104。

            輸入的N位數字k(0<=k<=101000,0<=N<2000)。

            設計完成函數,用偽碼實現。

             

            游戲研發工程師必做題

            1.一個游戲,角色屬性有:生命、攻擊、速度、防御、魔法,試設計一個角色的數據結構,用代碼實現。

            2.若該游戲發布了資料篇,資料篇中角色屬性添加了兩個:魔防、敏捷?,F改進原設計,怎么區分老版游戲和資料篇玩家,并正確讀取。

            3.在網絡游戲中GM通常有一定特權可以對角色屬性進行修改,現有GM1,可以對角色的攻擊屬性修改,而不能對其他屬性修改,試設計系統(所有屬性都是可讀的)。GM的指令通常為以下模式://moveto x,y;移動到x,y;//kick 用戶,踢出某一用戶。

             

            2.最優打怪路線

            玩家從東往西進行,打怪只能打南北的怪,消耗的能量與怪物離玩家的距離有關,試找出一個最好的打怪路線。

            注:玩家只能水平移動,怪物均是靜止的,不移動。

             

            1)證明該路線是最佳路線

            2)代碼實現

             

            3.用戶支付

            1)某一網絡游戲用戶分為3種類型:計時用戶、包月用戶、合作用戶,合作用戶是與別的廠家合作,可能在某一段時間免費或計費與別的不同,試設計一個支付系統,支付部分代碼實現。

            2)后來又添加了一種用戶:道具收費用戶,即玩家游戲時間免費,而是通過購買游戲中道具需要錢,4種用戶運行于同一臺服務器,試改進系統。


            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/qiluofei/archive/2007/10/20/1834263.aspx

            posted @ 2009-10-15 10:42 life02 閱讀(2897) | 評論 (0)編輯 收藏

            09.3.27更新  
                 

                    與玩游戲相比,寫游戲要復雜上千萬倍,除了需要掌握通用的編程技巧以外,還要有相當的圖形學,物理,數學基礎,特別是在國內,由于相關資料的缺乏,更是讓初學者無從下手。下面總結了一些入門方法和比較容易入手的資料。


                     首先你要精通一門高級語言,比如C++或者C#,其次,要有良好的英文閱讀能力。對游戲開發者來說英文閱讀能力是最重要也是最基本的工具之一,因為你遇到的大部分資源都將是英文的,不要總等著別人為你翻譯。慢慢嘗試著閱讀英文資料,你會發現其實也并沒有那么難:)


                     剛開始,你要做的就是選擇一門圖形API,一般就是DirectX或者OpenGL之間選一個。如果考慮到跨平臺,那么OGL是首選. 如果只在ms的平臺,則DX是首選。我對OGL并不是很了解,所以下面大部門資料都是和DX相關的。

                     當然,作為準備工作之一,你首先要到DirectX Develop Center下載最新版的DirectX SDK。


                     入門書籍非常重要,推薦<<Introduction to 3D Game Programming with DirectX 9.0>>(好像去年出了中文版)也就是傳說中的龍書,這可以說是最好的DX入門教材,Frank Luna從淺入深,討論了DX的方方面面。另外再配上<< Advanced 3D Game Programming With DirectX 9.0>>,書名雖然是advanced,但實際上沒有多少advanced級別的內容??赐赀@兩本書,你基本上已經對DirectX比較熟悉了。如果你希望學習XNA,也是一樣的,畢竟XNA是以DX為基礎。


                     不要一開始就看圖形學的書,這個時候你對圖形編程還沒有一個基本的感性認識,因此八成看的云里霧里。不要以網上的教程和論壇提問作為主要學習途徑,找一本好書,系統學習,效率才最高。不要馬上看SDK里的例子,很多圖形學的基本原理僅僅通過讀代碼是不會明白的。某些年代太過久遠的書就不要看了,比如《windows游戲編程大師技巧》(總看到有人在找這本書)。有人說基本的思想總是不變的,可惜對于現代GPU來說,很多早期的技術和優化技巧早就過時了。圖形編程是發展的非常快的技術,看看GPU的發展速度,1~2年就是一代產品的革新。


                      好了,入門之后,是你鞏固和拓展視野的階段?,F在看計算機圖形學就比較合適了。吐血推薦<<Real-Time-Rendering>>,這本書算得上是所有圖形程序員的必讀書籍和參考手冊了。最近剛出了第三版(更新:已經有電子版了)??上鴥戎挥械诙?,稍微有點老,如果實在找不到第三版,還是值得一讀。國內其他所有以圖形學命名的書都有一個共同點:枯燥,過時。只需看看其中二維三維變換和曲線曲面表示的部分即可。如果這個時候發現你當年數學沒有學好,那么有三本數學書是為游戲程序員量身定制的:<<3D Math Primer for Graphics and Game Development>>, <<Mathematics for 3D Game Programming and Computer Graphics>>和<<Essential Mathematics Guide 2nd Edition>>,第一本書有中文版,最后一本則是08年才出的新書。


                     其實入門之后,就沒有固定的學習路線了,最好根據你感興趣的方向來學習。


            Shader方面:《Cg_tutorial》和《The Complete Effect and HLSL Guide》都是不錯的入門材料,當然還有SDK文檔。<<Shaders for Game Programmers and Artists>>有大量入門的例子。<<Advanced Lighting And Materials With Shaders>>詳細介紹了各種光照模型和技術。<<GPU Gems>> 1~3冊肯定是必讀的,雖然有1,2有中文版,但某些翻譯并不是很理想,強烈建議直接看英文版。ShaderX系列也是很經典的系列,每年出版一本,包含了最新的實時渲染技術,如今已經出了第6冊了。不過網絡上只能找到1~3冊。1,2冊大部分shader都是用asm寫的,不過看懂原理,轉換為HLSL也并不難。另外Nvidia SDK和ATI SDK也是學習shader的重要資源。最后還有剛出的<< Programming Vertex, Geometry, and Pixel Shaders>>


            地形:<<Real Time 3D Terrain Engines Using C++ And DX9>>非常全面的討論了關于地形渲染的各種技術,至少應該把第5~9章都瀏覽一遍。之后便可以 到virtual terrain查閱近期的地形渲染技術。


            模型導入和動畫:<<Advanced Animation with DirectX>>,僅此一本足以。


            物理:<<Game Physics>>和<<Game Physics Engine Development>>都不錯。<<Real-time Collision Detection>>是碰撞檢測方面最好的書,可惜目前還沒有電子版。


            LOD:<<Level of Detail for 3D Graphics>>


            Ray tracing:<< Physical-Based Rendering - From Theory to Implementation>>


            引擎設計:說實話,這方面還沒有特別好的書,大概越是核心的內容,越少有人愿意寫吧。<<3D Game Engine Architecture Engineering Real-Time Applications with Wild Magic>>只有第三章值得一讀。<<3D Game Engine Programming>>可以選部分感興趣的章節看看,不過總的來說,講的比較淺。更新:<<3D Game Engine Design, Second Edition>>出了影印版本,強烈推薦。最近發現<<Pro OGRE 3D Programming>>也很不錯,200多頁短小精干,但是可以讓讀者快速了解一個既有引擎的設計和構架。


            AI:<<Programming Game AI by Example>>非常不錯,好像還有中文版,備選<<Artificial Intelligence for Games>>。當然<<AI Programming Wisdom>>系列也是必讀作品,不過目前網絡上只有1~2冊。

            網絡:%##@%...(本人是網絡白癡 +_+........)


            綜合:<<Game Programming Gems>>系列,不過由于內容涉及的過于廣泛,文章質量參差不齊,選擇性閱讀就可以了。歷年GDC, Gamefest t,Siggraph等大型會議的paper也是應該關注的。

                     至于那些“All in one”或者n天較你寫出個FPS游戲的書就不要讀了,這類書的通病是什么都說了,結果什么也沒說清楚。


                     除了書以外,再推薦一些不錯的網絡資源:

            www.GameDev.net 除了大量教程以外,論壇里多年累計下來的內容保羅萬象。好好利用論壇搜索,你會發不管你多厲害,那里總有一些比你強大的人在很久以前就遇到了和你同樣的問題,并且給出了解決方案。

            Nvidia和ATI的開發者中心

            creators.xna.com XNA官方網站

            www.gamasutra.com 與GameDev類似

            www.beyond3d.com 這里的除了討論軟件以外,還能看到對硬件構架的分析

            www.ziggyware.com 最好的XNA教程網站

            www.gameres.com 國內唯一比較專業的游戲編程網站,可惜和GameDev相比就顯得太寒磣了-_-#

                     當然,不要忘了收集各大論壇里牛人們的blog:)

                     最后,僅僅靠看書是不夠的,多寫多練才是王道。

            ps:以上書籍,除了特別注明的以外,都是可以通過網絡或者書店入手的。
            pps:不要找我要電子書,我能找到的,相信你也能找到,你找不到的,我肯定也沒有 :)

             

            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/soilwork/archive/2009/01/08/3731645.aspx

            posted @ 2009-10-10 21:37 life02 閱讀(229) | 評論 (0)編輯 收藏

            1、Java

            Java編程語言(第三版)---Java四大名著----James Gosling(Java之父)

            Java編程思想(第2版)----Java四大名著----Bruce Eckel

            Java編程思想(第3版)----Java四大名著----------------Bruce Eckel

            JAVA 2核心技術 卷I:基礎知識(原書第7版)---Java四大名著-----Cay Horstmann

            JAVA 2核心技術 卷II:高級特性(原書第7版)----Java四大名著-----Cay Horstmann

            Effective Java中文版------Java四大名著--------Joshua Bloch

            精通Struts:基于MVC的Java Web設計與開發---孫衛琴

            精通Hibernate:Java對象持久化技術詳解---孫衛琴

            Tomcat與Java Web開發技術詳解------------孫衛琴

            Java與模式------------------------------閻宏


            2、c#

            C#程序設計-------Charles Petzold“windows編程泰山北斗”---C#語言“倚天屠龍雙劍”

            C# Primer中文版--------Stanley B.Lippman---C#語言“倚天屠龍雙劍”

            .NET框架程序設計(修訂版)--------Jeffrey Richter“windows編程泰山北斗”---.NET平臺四大天王

            c#Windows程序設計----------Charles Petzold“windows編程泰山北斗”------.NET平臺四大天王

            .NET程序設計技術內幕-------------Jeff Prosise---.NET平臺四大天王

            .NET本質論--第1卷:公共語言運行庫(中文版)--------Chris Sells---.NET平臺四大天王

             

            3、C++

            C++程序設計語言(特別版)---c++八大金剛----Bjarne Stroustrup“C++之父”

            C++ Primer (第3版)中文版----c++八大金剛---Stanley B.Lippman

            C++ Primer (第4版)中文版----c++八大金剛---Stanley B.Lippman

            C++標準程序庫—自修教程與參考手冊--c++八大金剛--Nicolai M.Josuttis

            C++語言的設計和演化-----c++八大金剛----Bjarne Stroustrup“C++之父”

            深度探索C++對象模型---c++八大金剛----Stanley B.Lippman

            Essential C++中文版---c++八大金剛---Stanley B.Lippman

            Effective C++中文版 2nd Edition-----c++八大金剛------Scott Meyers

            More Effective C++中文版----c++八大金剛------Scott Meyers

            C++編程思想(第2版) 第1卷:標準C++導引--------Bruce Eckel

            C++編程思想(第2版)第2卷:實用編程技術 --------Bruce Eckel

            C++程序設計--------------------------譚浩強

            C++ 程序設計教程(第2版)--------------錢能

            C++ Primer Plus(第五版)中文版---Stephen Prata

            廣博如四庫全書The c++ programming language、c++ Primer
            深奧如山重水復Inside the c++ object model
            程序庫大全The c++ standard libray
            工程經驗之積累Effective c++、More Effective c++、Exceptional c++

             

            c++八大金剛:
            1、Essentital c++---lippman---C++之父,旁枝暫略,主攻核心,輕薄短小,初學者

            2、The c++ programming language----C++之父,技術權威,用詞深峻,思想深遠,c++百科全書代表

            3、c++ Primer----lippman---縱橫書市十數年,c++最佳教本,c++百科全書代表。
            4、Inside the c++ object model-----lippman----揭示c++底層,非常好,非常難。
            5、Effective c++-----通過50個編程實例,展示專家經驗,行文有趣,深處淺出。
            6、More Effective c++----通過35個編程實例,展示專家經驗,行文有趣,深處淺出。
            7、The c++ standard libray---c++標準庫的百科全書。
            8、設計模式:可復用面向對象軟件的基礎


            4、c

            C程序設計語言(第2版·新版)---C語言“倚天屠龍雙劍”---Brian W.Kernighan“C語言之父”

            C Primer Plus中文版(第五版)--------C語言“倚天屠龍雙劍”---Stephen Prata

            C程序設計(第三版)---------------------------譚浩強

            C語言大全(第四版)---------------------------HERBERT SCHILDT

            C語言接口與實現:創建可重用軟件的技術-------------DAVID R.HANSON  

            C語言參考手冊(原書第5版)--------------------------Samuel P.Harbison

            C程序設計教程---------------------------------H.M.Deitel/P.J.Deitel

            C陷阱與缺陷-----------------------------------Andrew Koenig  


            5、VB

            Visual Basic .NET技術內幕-----VB編程三劍客-----------Francesco Balena“vb首席大師”

            Windows程序設計-Visual Basic.NET語言描述--VB編程三劍客-----Charles Petzold“windows編程泰山

            北斗”---

            .NET框架程序設計:Visual Basic.NET語言描述--VB編程三劍客--Jeffrey Richter“windows編程泰山北

            斗”---,Francesco Balena“vb首席大師”  

            Visual Basic 6編程技術大全------------------------Francesco Balena“vb首席大師”

            Visual Basic.NET 從入門到精通-------------------------Petroutsos,E.

            高級VISUAL BASIC編程-----------------------------------MATTHEW CURLAND  


            6、Delphi

            Inside VCL(深入核心——VCL架構剖析)----------李維

            Delphi 7高效數據庫程序設計--------------李維

            面向對象開發實踐之路(Delphi版)----------李維


            7、VC

            Windows 程序設計(第5版)-----Charles Petzold“windows編程泰山北斗”---

            Windows核心編程----------Jeffrey Richter“windows編程泰山北斗”---

            Windows高級編程指南---------Jeffrey Richter“windows編程泰山北斗”---

            深入淺出MFC(第二版)-----“MFC四大天王”-------侯捷

            MFC Windows程序設計(第2版)---MFC四大天王”---------Jeff Prosise

            Visual C++ 技術內幕(第4版)--MFC四大天王”--------David Kruglinski

            深入解析MFC-------------MFC四大天王”-----------George Shepherd

            Visual C++.NET 技術內幕(第6版)-MFC四大天王”------------David Kruglinski


            8、vf

            Visual Foxpro程序設計參考手冊-------------------張洪舉

            專家門診——Visual FoxPro開發答疑160問-------------------張洪舉

            Visual FoxPro 6.0/9.0解決方案與范例大全-------------------張洪舉

            Visual FoxPro軟件開發模式與應用案例-------------------張洪舉

             

            9、黑客

            應用密碼學(協議算法與C源程序-----------Bruce Schneier

            網絡信息安全的真相-----------Bruce Schneier

            黑客大曝光:網絡安全機密與解決方案(第5版)--------STUART MCCLURE

            軟件加密技術內幕------------看雪學院

            加密與解密——軟件保護技術與完全解決方案------------看雪學院

            加密與解密(第二版)--------段鋼


            10、匯編

            Intel微處理器結構、編程與接口(第六版)---------Barry B. Brey

            80*86、奔騰機匯編語言程序設計---------Barry B. Brey

            Windows環境下32位匯編語言程序設計(第2版)-----------羅云彬

            IBM-PC匯編語言程序設計(第2版) 本書是國內優秀教材--------沈美明 溫冬嬋

            IBM PC匯編語言程序設計(第五版) 這本書籍是國外優秀教材-------PETER ABEL著,沈美明 溫冬蟬譯


            11、驅動開發

            Windows WDM設備驅動程序開發指南------------------------------------ Chris Cant

            Windows 2000/XP WDM設備驅動程序開發(第2版)--------------------------武安河

            WINDOWS 2000/XP WDM設備驅動程序開發-------------------------------- 武安河


            12、網絡

            計算機網絡第四版中文版----網絡編程三劍客--------------Andrew S.Tanenbaum


            TCP/IP詳解3卷本--------------------Richard Stevens----網絡編程三劍客

            UNIX網絡編程2卷本--------------------Richard Stevens----網絡編程三劍客

            用TCP/IP進行網際互聯-----------Douglas E. Comer

            高級TCP/IP編程-------------------Jon C. Snader

            C++網絡編程-----------------------Douglas Schmidt

            UNIX環境高級編程(第2版)--------------------Richard Stevens

             

            13、算法

            計算機程序設計藝術-------Donald.E.Knuth----------算法“倚天屠龍”雙劍

            算法導論-----------------Thomas H. Cormen--------算法“倚天屠龍”雙劍

            離散數學及其應用----------Kenneth H.Rosen

            具體數學—計算機科學基礎--------Donald.E.Knuth

             

            14、圖形編程
            Windows 圖形編程----------------FENG YUAN --圖形編程界的Charles Petzold之書


            15、數據結構

            數據結構 C++語言描述》58.00(Data Structures C++) William Ford,William Topp 劉衛東 沈官林

            數據結構算法與應用-C++語言描述》49.00Sartej Sahni 汪詩林 孫曉東等機械工業出版社

             

            16、軟件工程

            設計模式--可復用面向對象軟件的基礎

            重構—改善既有代碼的設計

             

            17、操作系統

            深入理解計算機系統(修訂版)-------RANDAL E.BRYANT

             

            18、Unix


            UNIX 網絡編程 卷I 套接字聯網API(英文版 第三版
            UNIX 編程藝術
            UNIX環境高級編程(英文影印第2版-----UNIX編程“圣經
            UNIX環境高級編程(英文影印版)(第2版)
            99-UNIX環境高級編程(第2版)
            UNIX環境高級編程(第2版)---UNIX編程“圣經
            UNIX網絡編程 第1卷:套接口API(第3版)
            UNIX網絡編程卷2:進程間通信(第2版)(英文影印版)
            UNIX 網絡編程(第二版)第2卷:進程間通信
            UNIX編程環境
            UNIX 網絡編程 卷I 套接字聯網API(英文版 第三版
            UNIX系統編程
            UNIX環境高級編程
            UNIX環境高級編程(英文影印版
            88-LINUX內核分析及編程
            UNIX 網絡編程 卷I 套接字聯網API(英文版 第三版)
            UNIX網絡編程 第1卷:套接口API(第3版)
            UNIX 網絡編程(第二版)第2卷:進程間通信
            UNIX網絡編程卷2:進程間通信(第2版)(英文影印版)
            UNIX 網絡編程(第2版)第1卷:套接口API和X/Open 傳輸接口API
            UNIX網絡編程(卷1):連網的APLS:套接字與XTI(第二版)(英文影印版)
            UNIX環境高級編程
            UNIX 環境高級編程(英文版)
            UNIX環境高級編程(第2版)
            Unix技術手冊

             

            19、Linux


            Linux內核設計與實現
            Linux內核完全注釋
            LINUX內核分析及編程
            GNU/Linux 編程指南(第二版)
            Linux設備驅動程序(第三版)
            嵌入式設計及Linux驅動開發指南——基于ARM 9處理器
            Linux設備驅動程序 第三版(英文影印版)
            Linux內核設計與實現(第2版)
            Linux內核設計與實現(英文影印版)(第2版)
            linux技術手冊


            20、游戲編程

            Windows游戲編程大師技巧(第二版
            游戲之旅--我的編程感悟
            OpenGL超級寶典:第三版
            OpenGL編程指南(第四版)
            Java 游戲高級編程
            J2ME手機游戲編程入門
            游戲之旅——我的編程感悟
            游戲開發中的人工智能(英文影印版)
            3D游戲:卷2 動畫與高級實時渲染技術
            面向對象的游戲開發
            Java 游戲高級編程
            3D游戲編程大師技巧
            游戲編程精粹
            面向對象的游戲開發
            3D游戲 卷1:實時渲染與軟件技術
            3D游戲:卷2 動畫與高級實時渲染技…
            J2ME手機游戲編程入門
            Direct3D游戲編程入門教程(第二版…

             

             

            21、移動開發

            Windows Mobile手機應用開發
            SYMBIAN OS C++手機應用開發
            68-Windows Mobile手機應用開發--傅曦 齊宇 徐駿
            48-SYMBIAN OS C++手機應用開發 (第2卷)------------------RICHARD HARRISON著,周良忠 王伯欣譯
            68-SYMBIAN OS C++手機應用開發---------------RICHARD HARRISON著,周良忠譯  
            Windows CE.net內核定制及應用程序開發---------周毓林 寧楊 陸貴強 付林林
            嵌入式系統Windows CE 開發技巧與實例--傅曦
            Palm OS編程實踐---絕版

             

            22、單片機

            單片機輕松入門----------------------------------周堅(平凡老師)  

            單片機典型模塊設計實例導航-----------------------求是科技

            例說8051----------------------------------------張義和 陳敵北

            KEIL CX51 V7.0單片機高級語言編程與ΜVISION2應用實踐-----徐愛鈞  

            單片機應用程序設計技術(修訂版)--------------------周航慈

            8051單片機實踐與應用-------------------------------吳金戎

            MCS-51系列單片機實用接口技術---------------------李華

            23、串并口通訊

            Visual C++/Turbo C串口通信編程實踐------------------龔建偉

            VISUAL BASIC與RS-232串行通信控制(最新版)----------范逸之

             

            24、電子

            無線電識圖與電路故障分析輕松入門(第二版) -------------------胡斌

            無線電元器件檢測與修理技術輕松入門(第二版) -------------------胡斌

            圖表細說電子技術識圖-------------------胡斌

            圖表細說電子元器件-------------------胡斌

            圖表細說元器件及實用電路-------------------胡斌


             

            posted @ 2009-10-09 18:47 life02 閱讀(302) | 評論 (0)編輯 收藏

            來自bc-cn C語言論壇

                   在C語言的學習中,對內存管理這部分的知識掌握尤其重要!之前對C中的malloc()和free()兩個函數的了解甚少,只知道大概該怎么用——就是malloc然后free就一切OK了。當然現在對這兩個函數的體會也不見得多,不過對于本文章第三部分的內容倒是有了轉折性的認識,所以寫下這篇文章作為一個對知識的總結。這篇文章之所以命名中有個“淺談”的字眼,也就是這個意思了!希望對大家有一點幫助!

                   如果不扯得太遠的話(比如說操作系統中虛擬內存和物理內存如何運做如何管理之類的知識等),我感覺這篇文章應該是比較全面地談了一下malloc()和free().這篇文章由淺入深(不見得有多深)分三個部分介紹主要內容。

            廢話了那么多,下面立刻進入主題================》》》》》》》》》》》》》》》》》》》》》


            一、malloc()和free()的基本概念以及基本用法:

            1、函數原型及說明:

            void *malloc(long NumBytes):該函數分配了NumBytes個字節,并返回了指向這塊內存的指針。如果分配失敗,則返回一個空指針(NULL)。

            關于分配失敗的原因,應該有多種,比如說空間不足就是一種。

            void free(void *FirstByte): 該函數是將之前用malloc分配的空間還給程序或者是操作系統,也就是釋放了這塊內存,讓它重新得到自由。

            2、函數的用法:

                 其實這兩個函數用起來倒不是很難,也就是malloc()之后覺得用夠了就甩了它把它給free()了,舉個簡單例子:

                    // Code...

                    char *Ptr = NULL;

                    Ptr = (char *)malloc(100 * sizeof(char));

                    if (NULL == Ptr){
                        exit (1);
                    }

                    gets(Ptr);

                    // code...

                    free(Ptr);

                    Ptr = NULL;

                    // code...

                   就是這樣!當然,具體情況要具體分析以及具體解決。比如說,你定義了一個指針,在一個函數里申請了一塊內存然后通過函數返回傳遞給這個指針,那么也許釋放這塊內存這項工作就應該留給其他函數了。

            3、關于函數使用需要注意的一些地方:

            A、申請了內存空間后,必須檢查是否分配成功。

            B、當不需要再使用申請的內存時,記得釋放;釋放后應該把指向這塊內存的指針指向NULL,防止程序后面不小心使用了它。

            C、這兩個函數應該是配對。如果申請后不釋放就是內存泄露;如果無故釋放那就是什么也沒有做。釋放只能一次,如果釋放兩次及兩次以上會出現錯誤(釋放空指針例外,釋放空指針其實也等于啥也沒做,所以釋放空指針釋放多少次都沒有問題)。

            D、雖然malloc()函數的類型是(void *),任何類型的指針都可以轉換成(void *),但是最好還是在前面進行強制類型轉換,因為這樣可以躲過一些編譯器的檢查。


            二、malloc()到底從哪里得來了內存空間:

            1、malloc()到底從哪里得到了內存空間?答案是從堆里面獲得空間。也就是說函數返回的指針是指向堆里面的一塊內存。操作系統中有一個記錄空閑內存地址的鏈表。當操作系統收到程序的申請時,就會遍歷該鏈表,然后就尋找第一個空間大于所申請空間的堆結點,然后就將該結點從空閑結點鏈表中刪除,并將該結點的空間分配給程序。就是這樣!

               說到這里,不得不另外插入一個小話題,相信大家也知道是什么話題了。什么是堆?說到堆,又忍不住說到了棧!什么是棧?下面就另外開個小部分專門而又簡單地說一下這個題外話:

            2、什么是堆:堆是大家共有的空間,分全局堆和局部堆。全局堆就是所有沒有分配的空間,局部堆就是用戶分配的空間。堆在操作系統對進程 初始化的時候分配,運行過程中也可以向系統要額外的堆,但是記得用完了要還給操作系統,要不然就是內存泄漏。

               什么是棧:棧是線程獨有的,保存其運行狀態和局部自動變量的。棧在線程開始的時候初始化,每個線程的?;ハ嗒毩?。每個函數都有自己的棧,棧被用來在函數之間傳遞參數。操作系統在切換線程的時候會自動的切換棧,就是切換SS/ESP寄存器。棧空間不需要在高級語言里面顯式的分配和釋放。

               以上的概念描述是標準的描述,不過有個別語句被我刪除,不知道因為這樣而變得不標準了^_^.

               通過上面對概念的描述,可以知道:

               棧是由編譯器自動分配釋放,存放函數的參數值、局部變量的值等。操作方式類似于數據結構中的棧。

               堆一般由程序員分配釋放,若不釋放,程序結束時可能由OS回收。注意這里說是可能,并非一定。所以我想再強調一次,記得要釋放!

            注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表。(這點我上面稍微提過)


               所以,舉個例子,如果你在函數上面定義了一個指針變量,然后在這個函數里申請了一塊內存讓指針指向它。實際上,這個指針的地址是在棧上,但是它所指向的內容卻是在堆上面的!這一點要注意!所以,再想想,在一個函數里申請了空間后,比如說下面這個函數:

               // code...

                   void Function(void)
                   {
                       char *p = (char *)malloc(100 * sizeof(char));
                   }

                   就這個例子,千萬不要認為函數返回,函數所在的棧被銷毀指針也跟著銷毀,申請的內存也就一樣跟著銷毀了!這絕對是錯誤的!因為申請的內存在堆上,而函數所在的棧被銷毀跟堆完全沒有啥關系。所以,還是那句話:記得釋放!

            3、free()到底釋放了什么

                    這個問題比較簡單,其實我是想和第二大部分的題目相呼應而已!哈哈!free()釋放的是指針指向的內存!注意!釋放的是內存,不是指針!這點非常非常重要!指針是一個變量,只有程序結束時才被銷毀。釋放了內存空間后,原來指向這塊空間的指針還是存在!只不過現在指針指向的內容的垃圾,是未定義的,所以說是垃圾。因此,前面我已經說過了,釋放內存后把指針指向NULL,防止指針在后面不小心又被解引用了。非常重要啊這一點!

                   好了!這個“題外話”終于說完了。就這么簡單說一次,知道個大概就可以了!下面就進入第三個部分:

            三、malloc()以及free()的機制:

                   這個部分我今天才有了新的認識!而且是轉折性的認識!所以,這部分可能會有更多一些認識上的錯誤!不對的地方請大家幫忙指出!

                   事實上,仔細看一下free()的函數原型,也許也會發現似乎很神奇,free()函數非常簡單,只有一個參數,只要把指向申請空間的指針傳遞給free()中的參數就可以完成釋放工作!這里要追蹤到malloc()的申請問題了。申請的時候實際上占用的內存要比申請的大。因為超出的空間是用來記錄對這塊內存的管理信息。先看一下在《UNIX環境高級編程》中第七章的一段話:

                   大多數實現所分配的存儲空間比所要求的要稍大一些,額外的空間用來記錄管理信息——分配塊的長度,指向下一個分配塊的指針等等。這就意味著如果寫過一個已分配區的尾端,則會改寫后一塊的管理信息。這種類型的錯誤是災難性的,但是因為這種錯誤不會很快就暴露出來,所以也就很難發現。將指向分配塊的指針向后移動也可能會改寫本塊的管理信息。

                   以上這段話已經給了我們一些信息了。malloc()申請的空間實際我覺得就是分了兩個不同性質的空間。一個就是用來記錄管理信息的空間,另外一個就是可用空間了。而用來記錄管理信息的實際上是一個結構體。在C語言中,用結構體來記錄同一個對象的不同信息是天經地義的事!下面看看這個結構體的原型:

               struct mem_control_block {

                   int is_available;    //這是一個標記?

                   int size;            //這是實際空間的大小

                };

                   對于size,這個是實際空間大小。這里其實我有個疑問,is_available是否是一個標記?因為我看了free()的源代碼之后對這個變量感覺有點納悶(源代碼在下面分析)。這里還請大家指出!

                   所以,free()就是根據這個結構體的信息來釋放malloc()申請的空間!而結構體的兩個成員的大小我想應該是操作系統的事了。但是這里有一個問題,malloc()申請空間后返回一個指針應該是指向第二種空間,也就是可用空間!不然,如果指向管理信息空間的話,寫入的內容和結構體的類型有可能不一致,或者會把管理信息屏蔽掉,那就沒法釋放內存空間了,所以會發生錯誤?。ǜ杏X自己這里說的是廢話)

                   好了!下面看看free()的源代碼,我自己分析了一下,覺得比起malloc()的源代碼倒是容易簡單很多。只是有個疑問,下面指出!

               // code...

              
                   void free(void *ptr)
                   {

                        struct mem_control_block *free;

                        free = ptr - sizeof(struct mem_control_block);

                        free->is_available = 1;

                        return;
                   }

                    看一下函數第二句,這句非常重要和關鍵。其實這句就是把指向可用空間的指針倒回去,讓它指向管理信息的那塊空間,因為這里是在值上減去了一個結構體的大??!后面那一句free->is_available = 1;我有點納悶!我的想法是:這里is_available應該只是一個標記而已!因為從這個變量的名稱上來看,is_available 翻譯過來就是“是可以用”。不要說我土!我覺得變量名字可以反映一個變量的作用,特別是嚴謹的代碼。這是源代碼,所以我覺得絕對是嚴謹的!!這個變量的值是1,表明是可以用的空間!只是這里我想了想,如果把它改為0或者是其他值不知道會發生什么事?!但是有一點我可以肯定,就是釋放絕對不會那么順利進行!因為這是一個標記!

                   當然,這里可能還是有人會有疑問,為什么這樣就可以釋放呢??我剛才也有這個疑問。后來我想到,釋放是操作系統的事,那么就free()這個源代碼來看,什么也沒有釋放,對吧?但是它確實是確定了管理信息的那塊內存的內容。所以,free()只是記錄了一些信息,然后告訴操作系統那塊內存可以去釋放,具體怎么告訴操作系統的我不清楚,但我覺得這個已經超出了我這篇文章的討論范圍了。

                   那么,我之前有個錯誤的認識,就是認為指向那塊內存的指針不管移到那塊內存中的哪個位置都可以釋放那塊內存!但是,這是大錯特錯!釋放是不可以釋放一部分的!首先這點應該要明白。而且,從free()的源代碼看,ptr只能指向可用空間的首地址,不然,減去結構體大小之后一定不是指向管理信息空間的首地址。所以,要確保指針指向可用空間的首地址!不信嗎?自己可以寫一個程序然后移動指向可用空間的指針,看程序會有會崩!

                   最后可能想到malloc()的源代碼看看malloc()到底是怎么分配空間的,這里面涉及到很多其他方面的知識!有興趣的朋友可以自己去下載源
            代碼去看看。


            四、關于其他:

                    關于C中的malloc()和free()的討論就寫到這里吧!寫了三個鐘頭,感覺有點累!希望對大家有所幫助!有不對的地方歡迎大家指出!最后,謝謝參與這個帖子討論的所有朋友,帖子:http://www.bc-cn.net/bbs/dispbbs.asp?boardID=5&ID=81781&page=1。

            posted @ 2009-10-09 13:02 life02 閱讀(240) | 評論 (0)編輯 收藏

            malloc/free和new/delete的區別
            2009年08月18日 星期二 11:26

            有了malloc/free為什么還要new/delete ?
                    malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們都可用于申請動態內存和釋放內存。

            對于非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由于malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加于malloc/free。

                    因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。

            我們先看一看malloc/free和new/delete如何實現對象的動態內存管理,見示例7-8。



            class Obj

            {

            public :

                     Obj(void){ cout << “Initialization” << endl; }

            ~Obj(void){ cout << “Destroy” << endl; }

            void     Initialize(void){ cout << “Initialization” << endl; }

            void     Destroy(void){ cout << “Destroy” << endl; }

            };

            void UseMallocFree(void)

            {

                 Obj   *a = (obj *)malloc(sizeof(obj));    // 申請動態內存

                 a->Initialize();                         // 初始化

                 //…

                 a->Destroy();    // 清除工作

                 free(a);         // 釋放內存

            }

            void UseNewDelete(void)

            {

                 Obj   *a = new Obj;   // 申請動態內存并且初始化

                 //…

                 delete a;            // 清除并且釋放內存

            }


            示例7-8 用malloc/free和new/delete如何實現對象的動態內存管理



            類Obj的函數Initialize模擬了構造函數的功能,函數Destroy模擬了析構函數的功能。函數UseMallocFree中,由于malloc/free不能執行構造函數與析構函數,必須調用成員函數Initialize和Destroy來完成初始化與清除工作。函數UseNewDelete則簡單得多。

            所以我們不要企圖用malloc/free來完成動態對象的內存管理,應該用new/delete。由于內部數據類型的“對象”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。

                 既然new/delete的功能完全覆蓋了malloc/free,為什么C++不把malloc/free淘汰出局呢?這是因為C++程序經常要調用C函數,而C程序只能用malloc/free管理動態內存。

            如果用free釋放“new創建的動態對象”,那么該對象因無法執行析構函數而可能導致程序出錯。如果用delete釋放“malloc申請的動態內存”,理論上講程序不會出錯,但是該程序的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。

            posted @ 2009-10-09 13:01 life02 閱讀(299) | 評論 (0)編輯 收藏

            僅列出標題
            共20頁: First 12 13 14 15 16 17 18 19 20 
            99久久这里只有精品| 亚洲日韩欧美一区久久久久我| 99久久99久久精品国产片果冻 | 7777久久亚洲中文字幕| 综合久久精品色| 亚洲人成电影网站久久| 思思久久好好热精品国产| 久久人人爽人人人人片av| 婷婷久久五月天| 亚洲va久久久噜噜噜久久天堂| 亚洲精品无码久久千人斩| 久久久老熟女一区二区三区| 久久久婷婷五月亚洲97号色 | 久久福利青草精品资源站免费 | 国产成人久久久精品二区三区| 久久精品国产影库免费看| 91久久精品电影| 亚洲国产精品无码久久久久久曰| 久久综合色老色| 久久亚洲精品中文字幕| 欧美亚洲另类久久综合| 色婷婷久久综合中文久久一本| 一本一道久久综合狠狠老| 国产精品久久久久影院色| 日韩中文久久| 久久99热国产这有精品| 亚洲欧美久久久久9999| 国产精品久久久久jk制服| 久久久这里有精品中文字幕| 亚洲精品无码久久久久去q| 嫩草影院久久国产精品| 久久久久久久精品成人热色戒| 狠狠狠色丁香婷婷综合久久俺| 久久久久久国产精品无码下载 | 亚洲国产欧美国产综合久久| 2020最新久久久视精品爱| 久久久久久伊人高潮影院| 国产精品激情综合久久| 精品国际久久久久999波多野| 久久久久18| 日本精品久久久久中文字幕|