• <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 - 297,  comments - 15,  trackbacks - 0

            C++面試題


            1.是不是一個(gè)父類寫了一個(gè)virtual 函數(shù),如果子類覆蓋它的函數(shù)不加virtual ,也能實(shí)現(xiàn)多態(tài)?

            virtual修飾符會(huì)被隱形繼承的。

            private 也被集成,只事派生類沒有訪問權(quán)限而已

            virtual可加可不加

            子類的空間里有父類的所有變量(static除外)

            同一個(gè)函數(shù)只存在一個(gè)實(shí)體(inline除外)

            子類覆蓋它的函數(shù)不加virtual ,也能實(shí)現(xiàn)多態(tài)。

            在子類的空間里,有父類的私有變量。私有變量不能直接訪問。


            --------------------------------------------------------------------------
            2.輸入一個(gè)字符串,將其逆序后輸出。(使用C++,不建議用偽碼)

            #include <iostream>
            using namespace std;


            void main()
            {
              char a[50];memset(a,0,sizeof(a));
              int i=0,j;
              char t;
              cin.getline(a,50,'\n');
              for(i=0,j=strlen(a)-1;i<strlen(a)/2;i++,j--)
              {
               t=a[i];
                  a[i]=a[j];
               a[j]=t;
              }
              cout<<a<<endl; 
            }

            //第二種

            string str;
            cin>>str;
            str.replace;
            cout<<str;


            --------------------------------------------------------------------------
            3.請(qǐng)簡(jiǎn)單描述Windows內(nèi)存管理的方法。

            內(nèi)存管理是操作系統(tǒng)中的重要部分,兩三句話恐怕誰也說不清楚吧~~
            我先說個(gè)大概,希望能夠拋磚引玉吧

            當(dāng)程序運(yùn)行時(shí)需要從內(nèi)存中讀出這段程序的代碼。代碼的位置必須在物理內(nèi)存中才能被運(yùn)行,由于現(xiàn)在的操作系統(tǒng)中有非常多的程序運(yùn)行著,內(nèi)存中不能夠完全放下,所以引出了虛擬內(nèi)存的概念。把哪些不常用的程序片斷就放入虛擬內(nèi)存,當(dāng)需要用到它的時(shí)候在load入主存(物理內(nèi)存)中。這個(gè)就是內(nèi)存管理所要做的事。內(nèi)存管理還有另外一件事需要做:計(jì)算程序片段在主存中的物理位置,以便CPU調(diào)度。

            內(nèi)存管理有塊式管理,頁式管理,段式和段頁式管理。現(xiàn)在常用段頁式管理

            塊式管理:把主存分為一大塊、一大塊的,當(dāng)所需的程序片斷不在主存時(shí)就分配一塊主存空間,把程 序片斷l(xiāng)oad入主存,就算所需的程序片度只有幾個(gè)字節(jié)也只能把這一塊分配給它。這樣會(huì)造成很大的浪費(fèi),平均浪費(fèi)了50%的內(nèi)存空間,但時(shí)易于管理。

            頁式管理:把主存分為一頁一頁的,每一頁的空間要比一塊一塊的空間小很多,顯然這種方法的空間利用率要比塊式管理高很多。

            段式管理:把主存分為一段一段的,每一段的空間又要比一頁一頁的空間小很多,這種方法在空間利用率上又比頁式管理高很多,但是也有另外一個(gè)缺點(diǎn)。一個(gè)程序片斷可能會(huì)被分為幾十段,這樣很多時(shí)間就會(huì)被浪費(fèi)在計(jì)算每一段的物理地址上(計(jì)算機(jī)最耗時(shí)間的大家都知道是I/O吧)。

            段頁式管理:結(jié)合了段式管理和頁式管理的優(yōu)點(diǎn)。把主存分為若干頁,每一頁又分為若干段。好處就很明顯,不用我多說了吧。

            各種內(nèi)存管理都有它自己的方法來計(jì)算出程序片斷在主存中的物理地址,其實(shí)都很相似。

            這只是一個(gè)大概而已,不足以說明內(nèi)存管理的皮毛。無論哪一本操作系統(tǒng)書上都有詳細(xì)的講解


            --------------------------------------------------------------------------
            4.
            #include "stdafx.h"
            #define SQR(X) X*X

            int main(int argc, char* argv[])
            {
             int a = 10;
             int k = 2;
             int m = 1;

             a /= SQR(k+m)/SQR(k+m);
             printf("%d\n",a);

             return 0;
            }
            這道題目的結(jié)果是什么啊?

            define 只是定義而已,在編擇時(shí)只是簡(jiǎn)單代換X*X而已,并不經(jīng)過算術(shù)法則的

            a /= (k+m)*(k+m)/(k+m)*(k+m);
            =>a /= (k+m)*1*(k+m);
            =>a = a/9;
            =>a = 1;
            上面的錯(cuò)了,該是
            a=a/(k+m*k+m/k+m*k+m)
                         a=a/(2+1*2+1/2+1*2+1)
            注意,因?yàn)閗,m為int型,所以1/2=0,即a=a/7=1(都為int型)
            gcc下檢查過,如果大家都為float型的話結(jié)果為10/7.5=1.33333

            --------------------------------------------------------------------------
            5.
            const 符號(hào)常量;
            (1)const char *p
            (2)char const *p
            (3)char * const p
            說明上面三種描述的區(qū)別;


            如果const位于星號(hào)的左側(cè),則const就是用來修飾指針?biāo)赶虻淖兞浚粗羔樦赶驗(yàn)槌A浚?br>如果const位于星號(hào)的右側(cè),const就是修飾指針本身,即指針本身是常量。

            (1)const char *p

            一個(gè)指向char類型的const對(duì)象指針,p不是常量,我們可以修改p的值,使其指向不同的char,但是不能改變它指向非char對(duì)象,如:
            const char *p;
            char c1='a';
            char c2='b';
            p=&c1;//ok
            p=&c2;//ok
            *p=c1;//error

            (2)char const *p
            (3)char * const p

            這兩個(gè)好象是一樣的,此時(shí)*p可以修改,而p不能修改。

            (4)const char * const p
            這種是地址及指向?qū)ο蠖疾荒苄薷摹?/p>

            --------------------------------------------------------------------------
            6.下面是C語言中兩種if語句判斷方式。請(qǐng)問哪種寫法更好?為什么?
             int n;
             if (n == 10) // 第一種判斷方式
             if (10 == n) // 第二種判斷方式

            如果少了個(gè)=號(hào),編譯時(shí)就會(huì)報(bào)錯(cuò),減少了出錯(cuò)的可能行,可以檢測(cè)出是否少了=

            --------------------------------------------------------------------------
            7.下面的代碼有什么問題?
            void DoSomeThing(...)
            {
             char* p;
             ...
             p = malloc(1024);  // 分配1K的空間
             if (NULL == p)
              return;
             ...
             p = realloc(p, 2048); // 空間不夠,重新分配到2K
             if (NULL == p)
              return;
             ...
            }

            A:
            p = malloc(1024);     應(yīng)該寫成: p = (char *) malloc(1024);
                    沒有釋放p的空間,造成內(nèi)存泄漏。


            --------------------------------------------------------------------------
            8.下面的代碼有什么問題?并請(qǐng)給出正確的寫法。
            void DoSomeThing(char* p)
            {
             char str[16];
             int n;
             assert(NULL != p);
             sscanf(p, "%s%d", str, n);
             if (0 == strcmp(str, "something"))
             {
              ...
             }
            }

            A:
            sscanf(p, "%s%d", str, n);   這句該寫成: sscanf(p, "%s%d", str, &n);

            --------------------------------------------------------------------------
            9.下面代碼有什么錯(cuò)誤?
            Void test1()
            {
             char string[10];
             char *str1="0123456789";
             strcpy(string, str1);
            }

            數(shù)組越界

            --------------------------------------------------------------------------
            10.下面代碼有什么問題?
            Void test2()
            {
              char string[10], str1[10];
              for(i=0; i<10;i++)
              {
                 str1[i] ='a';
              }
              strcpy(string, str1);
            }

            數(shù)組越界

            --------------------------------------------------------------------------
            11.下面代碼有什么問題?
            Void test3(char* str1)
            {
              char string[10];
              if(strlen(str1)<=10)
              {
                strcpy(string, str1);
              }
            }

            ==數(shù)組越界
            ==strcpy拷貝的結(jié)束標(biāo)志是查找字符串中的\0 因此如果字符串中沒有遇到\0的話 會(huì)一直復(fù)制,直到遇到\0,上面的123都因此產(chǎn)生越界的情況
             
            建議使用 strncpy 和 memcpy

            --------------------------------------------------------------------------
            12.下面代碼有什么問題?

            #define MAX_SRM 256

            DSN get_SRM_no()
            {
              static int SRM_no; //是不是這里沒賦初值?
              int I;
              for(I=0;I<MAX_SRM;I++,SRM_no++)
              {
                SRM_no %= MAX_SRM;
                if(MY_SRM.state==IDLE)
                {
                  break;
                }
              }
              if(I>=MAX_SRM)
                return (NULL_SRM);
              else
                return SRM_no;
            }

            系統(tǒng)會(huì)初始化static int變量為0,但該值會(huì)一直保存,所謂的不可重入...

            --------------------------------------------------------------------------
            13.寫出運(yùn)行結(jié)果:
            {// test1
                char str[] = "world"; cout << sizeof(str) << ": ";
                char *p    = str;     cout << sizeof(p) << ": ";
                char i     = 10;      cout << sizeof(i) << ": ";
                void *pp   = malloc(10);  cout << sizeof(p) << endl;
            }

            6:4:1:4

            --------------------------------------------------------------------------
            14.寫出運(yùn)行結(jié)果:
            {// test2
                union V {
             struct X {
              unsigned char s1:2;
              unsigned char s2:3;
              unsigned char s3:3;
             } x;

             unsigned char c;
                } v;

                v.c = 100;
                printf("%d", v.x.s3);

            }

            3

            --------------------------------------------------------------------------
            15.用C++寫個(gè)程序,如何判斷一個(gè)操作系統(tǒng)是16位還是32位的?不能用sizeof()函數(shù)

            A1:
            16位的系統(tǒng)下,
            int i = 65536;
            cout << i; // 輸出0;
            int i = 65535;
            cout << i; // 輸出-1;

            32位的系統(tǒng)下,
            int i = 65536;
            cout << i; // 輸出65536;
            int i = 65535;
            cout << i; // 輸出65535;

            A2:

            int a = ~0;
            if( a>65536 )
            {
                cout<<"32 bit"<<endl;
            }
            else
            {
                cout<<"16 bit"<<endl;
            }


            --------------------------------------------------------------------------
            16.C和C++有什么不同?

            從機(jī)制上:c是面向過程的(但c也可以編寫面向?qū)ο蟮某绦颍籧++是面向?qū)ο蟮模峁┝祟悺5牵?br>c++編寫面向?qū)ο蟮某绦虮萩容易

            從適用的方向:c適合要求代碼體積小的,效率高的場(chǎng)合,如嵌入式;c++適合更上層的,復(fù)雜的;  llinux核心大部分是c寫的,因?yàn)樗窍到y(tǒng)軟件,效率要求極高。

            從名稱上也可以看出,c++比c多了+,說明c++是c的超集;那為什么不叫c+而叫c++呢,是因?yàn)閏++比
            c來說擴(kuò)充的東西太多了,所以就在c后面放上兩個(gè)+;于是就成了c++

            C語言是結(jié)構(gòu)化編程語言,C++是面向?qū)ο缶幊陶Z言。
            C++側(cè)重于對(duì)象而不是過程,側(cè)重于類的設(shè)計(jì)而不是邏輯的設(shè)計(jì)。

            --------------------------------------------------------------------------
            17.在不用第三方參數(shù)的情況下,交換兩個(gè)參數(shù)的值
            #include <stdio.h>

            void main()
            {
                    int i=60;
                    int j=50;
                    i=i+j;
                    j=i-j;
                    i=i-j;
                    printf("i=%d\n",i);
                    printf("j=%d\n",j);
            }

            方法二:
            i^=j;
            j^=i;
            i^=j;

            方法三:
            // 用加減實(shí)現(xiàn),而且不會(huì)溢出
            a = a+b-(b=a)

            --------------------------------------------------------------------------
            18.有關(guān)位域的面試題(為什么輸出的是一個(gè)奇怪的字符)

            a.t = 'b';效果相當(dāng)于 a.t= 'b' & 0xf;

            'b' --> 01100010
            'b' & 0xf -->>00000010
            所以輸出Ascii碼為2的特殊字符


            char t:4;就是4bit的字符變量,同樣
            unsigned short i:8;就是8bit的無符號(hào)短整形變量

            --------------------------------------------------------------------------
            19.int i=10, j=10, k=3; k*=i+j; k最后的值是?

            60

            --------------------------------------------------------------------------
            20.進(jìn)程間通信的方式有?

            進(jìn)程間通信的方式有 共享內(nèi)存, 管道 ,Socket ,消息隊(duì)列 , DDE等

            --------------------------------------------------------------------------
            21.
            struct A
            {
            char t:4;
            char k:4;
            unsigned short i:8;
            unsigned long m;
            }
            sizeof(A)=?(不考慮邊界對(duì)齊)

            7

            struct CELL             // Declare CELL bit field
            {
               unsigned character  : 8;  // 00000000 ????????
               unsigned foreground : 3;  // 00000??? 00000000
               unsigned intensity  : 1;  // 0000?000 00000000
               unsigned background : 3;  // 0???0000 00000000
               unsigned blink      : 1;  // ?0000000 00000000
            } screen[25][80];       // Array of bit fields
            二、位結(jié)構(gòu)
                位結(jié)構(gòu)是一種特殊的結(jié)構(gòu), 在需按位訪問一個(gè)字節(jié)或字的多個(gè)位時(shí), 位結(jié)構(gòu)
            比按位運(yùn)算符更加方便。
                位結(jié)構(gòu)定義的一般形式為:
                 struct位結(jié)構(gòu)名{
                      數(shù)據(jù)類型 變量名: 整型常數(shù);
                      數(shù)據(jù)類型 變量名: 整型常數(shù);
                 } 位結(jié)構(gòu)變量;
                其中: 數(shù)據(jù)類型必須是int(unsigned或signed)。 整型常數(shù)必須是非負(fù)的整
            數(shù), 范圍是0~15, 表示二進(jìn)制位的個(gè)數(shù), 即表示有多少位。
                變量名是選擇項(xiàng), 可以不命名, 這樣規(guī)定是為了排列需要。
                例如: 下面定義了一個(gè)位結(jié)構(gòu)。
                 struct{
                      unsigned incon: 8;  /*incon占用低字節(jié)的0~7共8位*/
                      unsigned txcolor: 4;/*txcolor占用高字節(jié)的0~3位共4位*/
                      unsigned bgcolor: 3;/*bgcolor占用高字節(jié)的4~6位共3位*/
                      unsigned blink: 1;  /*blink占用高字節(jié)的第7位*/
                 }ch;
                位結(jié)構(gòu)成員的訪問與結(jié)構(gòu)成員的訪問相同。
                例如: 訪問上例位結(jié)構(gòu)中的bgcolor成員可寫成:
                  ch.bgcolor
             
                注意:
                1. 位結(jié)構(gòu)中的成員可以定義為unsigned, 也可定義為signed,  但當(dāng)成員長(zhǎng)
            度為1時(shí), 會(huì)被認(rèn)為是unsigned類型。因?yàn)閱蝹€(gè)位不可能具有符號(hào)。
                2. 位結(jié)構(gòu)中的成員不能使用數(shù)組和指針, 但位結(jié)構(gòu)變量可以是數(shù)組和指針,
            如果是指針, 其成員訪問方式同結(jié)構(gòu)指針。
                3. 位結(jié)構(gòu)總長(zhǎng)度(位數(shù)), 是各個(gè)位成員定義的位數(shù)之和,  可以超過兩個(gè)字
            節(jié)。
                4. 位結(jié)構(gòu)成員可以與其它結(jié)構(gòu)成員一起使用。
                例如:
                 struct info{
                      char name[8];
                      int age;
                      struct addr address;
                      float pay;
                      unsigned state: 1;
                      unsigned pay: 1;
                      }workers;
                上例的結(jié)構(gòu)定義了關(guān)于一個(gè)工人的信息。其中有兩個(gè)位結(jié)構(gòu)成員, 每個(gè)位結(jié)
            構(gòu)成員只有一位, 因此只占一個(gè)字節(jié)但保存了兩個(gè)信息, 該字節(jié)中第一位表示工
            人的狀態(tài), 第二位表示工資是否已發(fā)放。由此可見使用位結(jié)構(gòu)可以節(jié)省存貯空間。


            --------------------------------------------------------------------------
            22.下面的函數(shù)實(shí)現(xiàn)在一個(gè)固定的數(shù)上加上一個(gè)數(shù),有什么錯(cuò)誤,改正
            int add_n(int n)
            {
              static int i=100;
              i+=n;
              return i;
            }

            答:
            因?yàn)閟tatic使得i的值會(huì)保留上次的值。
            去掉static就可了

            --------------------------------------------------------------------------
            23.下面的代碼有什么問題?
            class A
            {
            public:
              A() { p=this; }
              ~A() { if(p!=NULL) { delete p; p=NULL; } }

              A* p;
            };

            答:
            會(huì)引起無限遞歸

            --------------------------------------------------------------------------
            24.
            union a {
             int a_int1;
             double a_double;
             int a_int2;
            };

            typedef struct
            {
             a a1;
             char y;
            } b;

            class c
            {
             double c_double;
             b b1;
             a a2;

            };

            輸出cout<<sizeof(c)<<endl;的結(jié)果?

            答:
            VC6環(huán)境下得出的結(jié)果是32

            另:
            我(sun)在VC6.0+win2k下做過試驗(yàn):
            short - 2
            int-4
            float-4
            double-8
            指針-4

            sizeof(union),以結(jié)構(gòu)里面size最大的為union的size

            解析C語言中的sizeof

            一、sizeof的概念 
              sizeof是C語言的一種單目操作符,如C語言的其他操作符++、--等。它并不是函數(shù)。sizeof操作符以字節(jié)形式給出了其操作數(shù)的存儲(chǔ)大小。操作數(shù)可以是一個(gè)表達(dá)式或括在括號(hào)內(nèi)的類型名。操作數(shù)的存儲(chǔ)大小由操作數(shù)的類型決定。 

            二、sizeof的使用方法 
              1、用于數(shù)據(jù)類型 

              sizeof使用形式:sizeof(type) 

              數(shù)據(jù)類型必須用括號(hào)括住。如sizeof(int)。 

              2、用于變量 

              sizeof使用形式:sizeof(var_name)或sizeof var_name 

              變量名可以不用括號(hào)括住。如sizeof (var_name),sizeof var_name等都是正確形式。帶括號(hào)的用法更普遍,大多數(shù)程序員采用這種形式。 

              注意:sizeof操作符不能用于函數(shù)類型,不完全類型或位字段。不完全類型指具有未知存儲(chǔ)大小的數(shù)據(jù)類型,如未知存儲(chǔ)大小的數(shù)組類型、未知內(nèi)容的結(jié)構(gòu)或聯(lián)合類型、void類型等。 

              如sizeof(max)若此時(shí)變量max定義為int max(),sizeof(char_v) 若此時(shí)char_v定義為char char_v [MAX]且MAX未知,sizeof(void)都不是正確形式。 

            三、sizeof的結(jié)果 
              sizeof操作符的結(jié)果類型是size_t,它在頭文件

            中typedef為unsigned int類型。該類型保證能容納實(shí)現(xiàn)所建立的最大對(duì)象的字節(jié)大小。 

              1、若操作數(shù)具有類型char、unsigned char或signed char,其結(jié)果等于1。 

              ANSI C正式規(guī)定字符類型為1字節(jié)。 

              2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double類型的sizeof 在ANSI C中沒有具體規(guī)定,大小依賴于實(shí)現(xiàn),一般可能分別為2、2、2、2、4、4、4、8、10。 

              3、當(dāng)操作數(shù)是指針時(shí),sizeof依賴于編譯器。例如Microsoft C/C++7.0中,near類指針字節(jié)數(shù)為2,far、huge類指針字節(jié)數(shù)為4。一般Unix的指針字節(jié)數(shù)為4。 

              4、當(dāng)操作數(shù)具有數(shù)組類型時(shí),其結(jié)果是數(shù)組的總字節(jié)數(shù)。 

              5、聯(lián)合類型操作數(shù)的sizeof是其最大字節(jié)成員的字節(jié)數(shù)。結(jié)構(gòu)類型操作數(shù)的sizeof是這種類型對(duì)象的總字節(jié)數(shù),包括任何墊補(bǔ)在內(nèi)。 

              讓我們看如下結(jié)構(gòu): 

              struct {char b; double x;} a; 

              在某些機(jī)器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。 

              這是因?yàn)榫幾g器在考慮對(duì)齊問題時(shí),在結(jié)構(gòu)中插入空位以控制各成員對(duì)象的地址對(duì)齊。如double類型的結(jié)構(gòu)成員x要放在被4整除的地址。 

              6、如果操作數(shù)是函數(shù)中的數(shù)組形參或函數(shù)類型的形參,sizeof給出其指針的大小。 

            四、sizeof與其他操作符的關(guān)系 
              sizeof的優(yōu)先級(jí)為2級(jí),比/、%等3級(jí)運(yùn)算符優(yōu)先級(jí)高。它可以與其他操作符一起組成表達(dá)式。如i*sizeof(int);其中i為int類型變量。 

            五、sizeof的主要用途 
              1、sizeof操作符的一個(gè)主要用途是與存儲(chǔ)分配和I/O系統(tǒng)那樣的例程進(jìn)行通信。例如: 

              void *malloc(size_t size), 

              size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。 

              2、sizeof的另一個(gè)的主要用途是計(jì)算數(shù)組中元素的個(gè)數(shù)。例如: 

              void * memset(void * s,int c,sizeof(s))。 

            六、建議 
              由于操作數(shù)的字節(jié)數(shù)在實(shí)現(xiàn)時(shí)可能出現(xiàn)變化,建議在涉及到操作數(shù)字節(jié)大小時(shí)用sizeof來代替常量計(jì)算。


            =============================================================
            本文主要包括二個(gè)部分,第一部分重點(diǎn)介紹在VC中,怎么樣采用sizeof來求結(jié)構(gòu)的大小,以及容易出現(xiàn)的問題,并給出解決問題的方法,第二部分總結(jié)出VC中sizeof的主要用法。

            1、 sizeof應(yīng)用在結(jié)構(gòu)上的情況

            請(qǐng)看下面的結(jié)構(gòu):

            struct MyStruct

            {

            double dda1;

            char dda;

            int type

            };

            對(duì)結(jié)構(gòu)MyStruct采用sizeof會(huì)出現(xiàn)什么結(jié)果呢?sizeof(MyStruct)為多少呢?也許你會(huì)這樣求:

            sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13

            但是當(dāng)在VC中測(cè)試上面結(jié)構(gòu)的大小時(shí),你會(huì)發(fā)現(xiàn)sizeof(MyStruct)為16。你知道為什么在VC中會(huì)得出這樣一個(gè)結(jié)果嗎?

            其實(shí),這是VC對(duì)變量存儲(chǔ)的一個(gè)特殊處理。為了提高CPU的存儲(chǔ)速度,VC對(duì)一些變量的起始地址做了"對(duì)齊"處理。在默認(rèn)情況下,VC規(guī)定各成員變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量必須為該變量的類型所占用的字節(jié)數(shù)的倍數(shù)。下面列出常用類型的對(duì)齊方式(vc6.0,32位系統(tǒng))。

            類型
            對(duì)齊方式(變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量)

            Char
            偏移量必須為sizeof(char)即1的倍數(shù)

            int
            偏移量必須為sizeof(int)即4的倍數(shù)

            float
            偏移量必須為sizeof(float)即4的倍數(shù)

            double
            偏移量必須為sizeof(double)即8的倍數(shù)

            Short
            偏移量必須為sizeof(short)即2的倍數(shù)


            各成員變量在存放的時(shí)候根據(jù)在結(jié)構(gòu)中出現(xiàn)的順序依次申請(qǐng)空間,同時(shí)按照上面的對(duì)齊方式調(diào)整位置,空缺的字節(jié)VC會(huì)自動(dòng)填充。同時(shí)VC為了確保結(jié)構(gòu)的大小為結(jié)構(gòu)的字節(jié)邊界數(shù)(即該結(jié)構(gòu)中占用最大空間的類型所占用的字節(jié)數(shù))的倍數(shù),所以在為最后一個(gè)成員變量申請(qǐng)空間后,還會(huì)根據(jù)需要自動(dòng)填充空缺的字節(jié)。

            下面用前面的例子來說明VC到底怎么樣來存放結(jié)構(gòu)的。

            struct MyStruct

            {

            double dda1;

            char dda;

            int type

            };

            為上面的結(jié)構(gòu)分配空間的時(shí)候,VC根據(jù)成員變量出現(xiàn)的順序和對(duì)齊方式,先為第一個(gè)成員dda1分配空間,其起始地址跟結(jié)構(gòu)的起始地址相同(剛好偏移量0剛好為sizeof(double)的倍數(shù)),該成員變量占用sizeof(double)=8個(gè)字節(jié);接下來為第二個(gè)成員dda分配空間,這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為8,是sizeof(char)的倍數(shù),所以把dda存放在偏移量為8的地方滿足對(duì)齊方式,該成員變量占用sizeof(char)=1個(gè)字節(jié);接下來為第三個(gè)成員type分配空間,這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為9,不是sizeof(int)=4的倍數(shù),為了滿足對(duì)齊方式對(duì)偏移量的約束問題,VC自動(dòng)填充3個(gè)字節(jié)(這三個(gè)字節(jié)沒有放什么東西),這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為12,剛好是sizeof(int)=4的倍數(shù),所以把type存放在偏移量為12的地方,該成員變量占用sizeof(int)=4個(gè)字節(jié);這時(shí)整個(gè)結(jié)構(gòu)的成員變量已經(jīng)都分配了空間,總的占用的空間大小為:8+1+3+4=16,剛好為結(jié)構(gòu)的字節(jié)邊界數(shù)(即結(jié)構(gòu)中占用最大空間的類型所占用的字節(jié)數(shù)sizeof(double)=8)的倍數(shù),所以沒有空缺的字節(jié)需要填充。所以整個(gè)結(jié)構(gòu)的大小為:sizeof(MyStruct)=8+1+3+4=16,其中有3個(gè)字節(jié)是VC自動(dòng)填充的,沒有放任何有意義的東西。

            下面再舉個(gè)例子,交換一下上面的MyStruct的成員變量的位置,使它變成下面的情況:

            struct MyStruct

            {

            char dda;

            double dda1;  

            int type

            };

            這個(gè)結(jié)構(gòu)占用的空間為多大呢?在VC6.0環(huán)境下,可以得到sizeof(MyStruc)為24。結(jié)合上面提到的分配空間的一些原則,分析下VC怎么樣為上面的結(jié)構(gòu)分配空間的。(簡(jiǎn)單說明)

            struct MyStruct

            {

              char dda;//偏移量為0,滿足對(duì)齊方式,dda占用1個(gè)字節(jié);

            double dda1;//下一個(gè)可用的地址的偏移量為1,不是sizeof(double)=8

                         //的倍數(shù),需要補(bǔ)足7個(gè)字節(jié)才能使偏移量變?yōu)?(滿足對(duì)齊

                         //方式),因此VC自動(dòng)填充7個(gè)字節(jié),dda1存放在偏移量為8

                         //的地址上,它占用8個(gè)字節(jié)。

            int type;//下一個(gè)可用的地址的偏移量為16,是sizeof(int)=4的倍

                       //數(shù),滿足int的對(duì)齊方式,所以不需要VC自動(dòng)填充,type存

                       //放在偏移量為16的地址上,它占用4個(gè)字節(jié)。

            };//所有成員變量都分配了空間,空間總的大小為1+7+8+4=20,不是結(jié)構(gòu)

               //的節(jié)邊界數(shù)(即結(jié)構(gòu)中占用最大空間的類型所占用的字節(jié)數(shù)sizeof

               //(double)=8)的倍數(shù),所以需要填充4個(gè)字節(jié),以滿足結(jié)構(gòu)的大小為

               //sizeof(double)=8的倍數(shù)。


            所以該結(jié)構(gòu)總的大小為:sizeof(MyStruc)為1+7+8+4+4=24。其中總的有7+4=11個(gè)字節(jié)是VC自動(dòng)填充的,沒有放任何有意義的東西。


            VC對(duì)結(jié)構(gòu)的存儲(chǔ)的特殊處理確實(shí)提高CPU存儲(chǔ)變量的速度,但是有時(shí)候也帶來了一些麻煩,我們也屏蔽掉變量默認(rèn)的對(duì)齊方式,自己可以設(shè)定變量的對(duì)齊方式。

            VC中提供了#pragma pack(n)來設(shè)定變量以n字節(jié)對(duì)齊方式。n字節(jié)對(duì)齊就是說變量存放的起始地址的偏移量有兩種情況:第一、如果n大于等于該變量所占用的字節(jié)數(shù),那么偏移量必須滿足默認(rèn)的對(duì)齊方式,第二、如果n小于該變量的類型所占用的字節(jié)數(shù),那么偏移量為n的倍數(shù),不用滿足默認(rèn)的對(duì)齊方式。結(jié)構(gòu)的總大小也有個(gè)約束條件,分下面兩種情況:如果n大于所有成員變量類型所占用的字節(jié)數(shù),那么結(jié)構(gòu)的總大小必須為占用空間最大的變量占用的空間數(shù)的倍數(shù);

            否則必須為n的倍數(shù)。下面舉例說明其用法。

            #pragma pack(push) //保存對(duì)齊狀態(tài)

            #pragma pack(4)//設(shè)定為4字節(jié)對(duì)齊

            struct test

            {

              char m1;

              double m4;

              int  m3;

            };

            #pragma pack(pop)//恢復(fù)對(duì)齊狀態(tài)

            以上結(jié)構(gòu)的大小為16,下面分析其存儲(chǔ)情況,首先為m1分配空間,其偏移量為0,滿足我們自己設(shè)定的對(duì)齊方式(4字節(jié)對(duì)齊),m1占用1個(gè)字節(jié)。接著開始為m4分配空間,這時(shí)其偏移量為1,需要補(bǔ)足3個(gè)字節(jié),這樣使偏移量滿足為n=4的倍數(shù)(因?yàn)閟izeof(double)大于n),m4占用8個(gè)字節(jié)。接著為m3分配空間,這時(shí)其偏移量為12,滿足為4的倍數(shù),m3占用4個(gè)字節(jié)。這時(shí)已經(jīng)為所有成員變量分配了空間,共分配了16個(gè)字節(jié),滿足為n的倍數(shù)。如果把上面的#pragma pack(4)改為#pragma pack(16),那么我們可以得到結(jié)構(gòu)的大小為24。(請(qǐng)讀者自己分析)

            2、 sizeof用法總結(jié)

            在VC中,sizeof有著許多的用法,而且很容易引起一些錯(cuò)誤。下面根據(jù)sizeof后面的參數(shù)對(duì)sizeof的用法做個(gè)總結(jié)。

            A.  參數(shù)為數(shù)據(jù)類型或者為一般變量。例如sizeof(int),sizeof(long)等等。這種情況要注意的是不同系統(tǒng)系統(tǒng)或者不同編譯器得到的結(jié)果可能是不同的。例如int類型在16位系統(tǒng)中占2個(gè)字節(jié),在32位系統(tǒng)中占4個(gè)字節(jié)。

            B.  參數(shù)為數(shù)組或指針。下面舉例說明.

            int a[50];  //sizeof(a)=4*50=200; 求數(shù)組所占的空間大小

            int *a=new int[50];// sizeof(a)=4; a為一個(gè)指針,sizeof(a)是求指針

                               //的大小,在32位系統(tǒng)中,當(dāng)然是占4個(gè)字節(jié)。

            C.  參數(shù)為結(jié)構(gòu)或類。Sizeof應(yīng)用在類和結(jié)構(gòu)的處理情況是相同的。但有兩點(diǎn)需要注意,第一、結(jié)構(gòu)或者類中的靜態(tài)成員不對(duì)結(jié)構(gòu)或者類的大小產(chǎn)生影響,因?yàn)殪o態(tài)變量的存儲(chǔ)位置與結(jié)構(gòu)或者類的實(shí)例地址無關(guān)。

            第二、沒有成員變量的結(jié)構(gòu)或類的大小為1,因?yàn)楸仨毐WC結(jié)構(gòu)或類的每一

            個(gè)實(shí)例在內(nèi)存中都有唯一的地址。

            下面舉例說明,

            Class Test{int a;static double c};//sizeof(Test)=4.

            Test *s;//sizeof(s)=4,s為一個(gè)指針。

            Class test1{ };//sizeof(test1)=1;

            D.  參數(shù)為其他。下面舉例說明。

               int func(char s[5]);

               {

                 cout<<sizeof(s);//這里將輸出4,本來s為一個(gè)數(shù)組,但由于做為函

                                 //數(shù)的參數(shù)在傳遞的時(shí)候系統(tǒng)處理為一個(gè)指針,所

                                 //以sizeof(s)實(shí)際上為求指針的大小。

                 return 1;

            }

            sizeof(func("1234"))=4//因?yàn)閒unc的返回類型為int,所以相當(dāng)于

                                 //求sizeof(int).


            以上為sizeof的基本用法,在實(shí)際的使用中要注意分析VC的分配變量的分配策略,這樣的話可以避免一些錯(cuò)誤。


            --------------------------------------------------------------------------
            25.i最后等于多少?
            int i = 1;
            int j = i++;
            if((i>j++) && (i++ == j)) i+=j;

            答:
            i = 5

            --------------------------------------------------------------------------
            26.
            unsigned short array[]={1,2,3,4,5,6,7};
            int i = 3;
            *(array + i) = ?

            答:
            4

            --------------------------------------------------------------------------
            27.
            class A
            {
              virtual void func1();
              void func2();
            }
            Class B: class A
            {
              void func1(){cout << "fun1 in class B" << endl;}
              virtual void func2(){cout << "fun2 in class B" << endl;}
            }
            A, A中的func1和B中的func2都是虛函數(shù).
            B, A中的func1和B中的func2都不是虛函數(shù).
            C, A中的func2是虛函數(shù).,B中的func1不是虛函數(shù).
            D, A中的func2不是虛函數(shù),B中的func1是虛函數(shù).

            答:
            A

            --------------------------------------------------------------------------
            28.
            數(shù)據(jù)庫(kù):抽出部門,平均工資,要求按部門的字符串順序排序,不能含有"human resource"部門,

            employee結(jié)構(gòu)如下:employee_id, employee_name, depart_id,depart_name,wage

            答:
            select depart_name, avg(wage)
            from employee
            where depart_name <> 'human resource'
            group by depart_name
            order by depart_name

            --------------------------------------------------------------------------
            29.
            給定如下SQL數(shù)據(jù)庫(kù):Test(num INT(4)) 請(qǐng)用一條SQL語句返回num的最小值,但不許使用統(tǒng)計(jì)功能,如MIN,MAX等

            答:
            select top 1 num
            from Test
            order by num desc

            --------------------------------------------------------------------------
            30.
            輸出下面程序結(jié)果。

            #include <iostream.h>

            class A
            {
            public:
             virtual void print(void)
             {
                cout<<"A::print()"<<endl;
             }
            };
            class B:public A
            {
            public:
             virtual void print(void)
             {
               cout<<"B::print()"<<endl;
             };
            };
            class C:public B
            {
            public:
             virtual void print(void)
             {
              cout<<"C::print()"<<endl;
             }
            };
            void print(A a)
            {
               a.print();
            }
            void main(void)
            {
               A a, *pa,*pb,*pc;
               B b;
               C c;
              
               pa=&a;
               pb=&b;
               pc=&c;
              
               a.print();
               b.print();
               c.print();
              
               pa->print();
               pb->print();
               pc->print();
              
               print(a);
               print(b);
               print(c);
            }

            A:
            A::print()
            B::print()
            C::print()
            A::print()
            B::print()
            C::print()
            A::print()
            A::print()
            A::print()

            --------------------------------------------------------------------------
            31.
            試編寫函數(shù)判斷計(jì)算機(jī)的字節(jié)存儲(chǔ)順序是開序(little endian)還是降序(bigendian)

            答:
            bool IsBigendian()
            {
             unsigned short usData = 0x1122;
             unsigned char  *pucData = (unsigned char*)&usData;

             return (*pucData == 0x22);
            }

            --------------------------------------------------------------------------
            32.簡(jiǎn)述Critical Section和Mutex的不同點(diǎn)

            答:
            對(duì)幾種同步對(duì)象的總結(jié)
            1.Critical Section
            A.速度快
            B.不能用于不同進(jìn)程
            C.不能進(jìn)行資源統(tǒng)計(jì)(每次只可以有一個(gè)線程對(duì)共享資源進(jìn)行存取)

            2.Mutex
            A.速度慢
            B.可用于不同進(jìn)程
            C.不能進(jìn)行資源統(tǒng)計(jì)

            3.Semaphore
            A.速度慢
            B.可用于不同進(jìn)程
            C.可進(jìn)行資源統(tǒng)計(jì)(可以讓一個(gè)或超過一個(gè)線程對(duì)共享資源進(jìn)行存取)

            4.Event
            A.速度慢
            B.可用于不同進(jìn)程
            C.可進(jìn)行資源統(tǒng)計(jì)


            --------------------------------------------------------------------------
            33.一個(gè)數(shù)據(jù)庫(kù)中有兩個(gè)表:
            一張表為Customer,含字段ID,Name;
            一張表為Order,含字段ID,CustomerID(連向Customer中ID的外鍵),Revenue;
            寫出求每個(gè)Customer的Revenue總和的SQL語句。

            建表
            create table customer
            (
            ID int primary key,Name char(10)
            )

            go

            create table [order]
            (
            ID int primary key,CustomerID  int foreign key references customer(id) , Revenue float
            )

            go

            --查詢
            select Customer.ID, sum( isnull([Order].Revenue,0) )
            from customer full join [order]
            on( [order].customerid=customer.id )
            group by customer.id

            --------------------------------------------------------------------------
            34.請(qǐng)指出下列程序中的錯(cuò)誤并且修改
            void GetMemory(char *p){
              p=(char *)malloc(100);
            }
            void Test(void){
              char *str=NULL;
              GetMemory=(str);
              strcpy(str,"hello world");
              printf(str);
            }

            A:錯(cuò)誤--參數(shù)的值改變后,不會(huì)傳回
            GetMemory并不能傳遞動(dòng)態(tài)內(nèi)存,Test函數(shù)中的 str一直都是 NULL。
            strcpy(str, "hello world");將使程序崩潰。

            修改如下:
            char *GetMemory(){
              char *p=(char *)malloc(100);
              return p;
            }
            void Test(void){
              char *str=NULL;
              str=GetMemory(){
              strcpy(str,"hello world");
              printf(str);
            }

            方法二:void GetMemory2(char **p)變?yōu)槎?jí)指針.
            void GetMemory2(char **p, int num)
            {
             *p = (char *)malloc(sizeof(char) * num);
            }

            --------------------------------------------------------------------------
            35.程序改錯(cuò)
            class mml
            {
              private:
                static unsigned int x;
              public:
                mml(){ x++; }
                mml(static unsigned int &) {x++;}
                ~mml{x--;}
              pulic:
                virtual mon() {} = 0;
                static unsigned int mmc(){return x;}
                ......                     
             
            };
            class nnl:public mml
            {
              private:
                static unsigned int y;
              public:
                nnl(){ x++; }
                nnl(static unsigned int &) {x++;}
                ~nnl{x--;}
              public:
                virtual mon() {};
                 static unsigned int nnc(){return y;}
                ......                  
            };

            代碼片斷:
            mml* pp = new nnl;
            ..........
            delete pp;


            A:
            基類的析構(gòu)函數(shù)應(yīng)該為虛函數(shù)
            virtual ~mml{x--;}

            --------------------------------------------------------------------------
            36.101個(gè)硬幣100真、1假,真假區(qū)別在于重量。請(qǐng)用無砝碼天平稱兩次給出真幣重還是假幣重的結(jié)論。

            答:
            101個(gè)先取出2堆,
            33,33
            第一次稱,如果不相等,說明有一堆重或輕
            那么把重的那堆拿下來,再放另外35個(gè)中的33
            如果相等,說明假的重,如果不相等,新放上去的還是重的話,說明假的輕(不可能新放上去的輕)

            第一次稱,如果相等的話,這66個(gè)肯定都是真的,從這66個(gè)中取出35個(gè)來,與剩下的沒稱過的35個(gè)比
            下面就不用說了

            方法二:
            第3題也可以拿A(50),B(50)比一下,一樣的話拿剩下的一個(gè)和真的比一下。
            如果不一樣,就拿其中的一堆。比如A(50)再分成兩堆25比一下,一樣的話就在
            B(50)中,不一樣就在A(50)中,結(jié)合第一次的結(jié)果就知道了。

            --------------------------------------------------------------------------
            37.static變量和static 函數(shù)各有什么特點(diǎn)?

            答:
            static變量:在程序運(yùn)行期內(nèi)一直有效,如果定義在函數(shù)外,則在編譯單元內(nèi)可見,如果在函數(shù)內(nèi),在在定義的block內(nèi)可見;
            static函數(shù):在編譯單元內(nèi)可見;

            --------------------------------------------------------------------------
            38.用C 寫一個(gè)輸入的整數(shù),倒著輸出整數(shù)的函數(shù),要求用遞歸方法 ;

            答:
            void fun( int a )
            {
             printf( "%d", a%10 );
             a /= 10;
             if( a <=0 )return;

             fun( a );
            }

            --------------------------------------------------------------------------
            39.寫出程序結(jié)果:
            void Func(char str[100])
            {
              printf("%d\n", sizeof(str));
            }

            答:
            4
            分析:
            指針長(zhǎng)度

            --------------------------------------------------------------------------
            40.int id[sizeof(unsigned long)];
                這個(gè)對(duì)嗎?為什么??

            答:
            對(duì)
            這個(gè) sizeof是編譯時(shí)運(yùn)算符,編譯時(shí)就確定了
            可以看成和機(jī)器有關(guān)的常量。


            本文主要包括二個(gè)部分,第一部分重點(diǎn)介紹在VC中,怎么樣采用sizeof來求結(jié)構(gòu)的大小,以及容易出現(xiàn)的問題,并給出解決問題的方法,第二部分總結(jié)出VC中sizeof的主要用法。

            1、 sizeof應(yīng)用在結(jié)構(gòu)上的情況

            請(qǐng)看下面的結(jié)構(gòu):

            struct MyStruct

            {

            double dda1;

            char dda;

            int type

            };

            對(duì)結(jié)構(gòu)MyStruct采用sizeof會(huì)出現(xiàn)什么結(jié)果呢?sizeof(MyStruct)為多少呢?也許你會(huì)這樣求:

            sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13

            但是當(dāng)在VC中測(cè)試上面結(jié)構(gòu)的大小時(shí),你會(huì)發(fā)現(xiàn)sizeof(MyStruct)為16。你知道為什么在VC中會(huì)得出這樣一個(gè)結(jié)果嗎?

            其實(shí),這是VC對(duì)變量存儲(chǔ)的一個(gè)特殊處理。為了提高CPU的存儲(chǔ)速度,VC對(duì)一些變量的起始地址做了"對(duì)齊"處理。在默認(rèn)情況下,VC規(guī)定各成員變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量必須為該變量的類型所占用的字節(jié)數(shù)的倍數(shù)。下面列出常用類型的對(duì)齊方式(vc6.0,32位系統(tǒng))。

            類型
            對(duì)齊方式(變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量)

            Char
            偏移量必須為sizeof(char)即1的倍數(shù)

            int
            偏移量必須為sizeof(int)即4的倍數(shù)

            float
            偏移量必須為sizeof(float)即4的倍數(shù)

            double
            偏移量必須為sizeof(double)即8的倍數(shù)

            Short
            偏移量必須為sizeof(short)即2的倍數(shù)


            各成員變量在存放的時(shí)候根據(jù)在結(jié)構(gòu)中出現(xiàn)的順序依次申請(qǐng)空間,同時(shí)按照上面的對(duì)齊方式調(diào)整位置,空缺的字節(jié)VC會(huì)自動(dòng)填充。同時(shí)VC為了確保結(jié)構(gòu)的大小為結(jié)構(gòu)的字節(jié)邊界數(shù)(即該結(jié)構(gòu)中占用最大空間的類型所占用的字節(jié)數(shù))的倍?/textarea>

             

            Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=574158

            posted on 2009-12-05 23:25 chatler 閱讀(666) 評(píng)論(1)  編輯 收藏 引用 所屬分類: interview

            FeedBack:
            # re: 全面整理的C++面試題
            2009-12-13 00:39 | chatler
            4。分析一下
            #include<iostream.h>
            #include <string.h>
            #include <malloc.h>
            #include <stdio.h>
            #include <stdlib.h>
            #include <memory.h>
            typedef struct AA
            {
            int b1:5;
            int b2:2;
            }AA;
            void main()
            {
            AA aa;
            char cc[100];
            strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
            memcpy(&aa,cc,sizeof(AA));
            cout << aa.b1 <<endl;
            cout << aa.b2 <<endl;
            }

            答案: -16和1
            首先sizeof(AA)的大小為4,b1和b2分別占5bit和2bit.
            經(jīng)過strcpy和memcpy后,aa的4個(gè)字節(jié)所存放的值是:
            0,1,2,3的ASC碼,即00110000,00110001,00110010,00110011
            所以,最后一步:顯示的是這4個(gè)字節(jié)的前5位,和之后的2位
            分別為:10000,和01
            因?yàn)閕nt是有正負(fù)之分  所以是-16和1

            5。求函數(shù)返回值,輸入x=9999;
            int func ( x )
            {
            int countx = 0;
            while ( x )
            {
            countx ++;
            x = x&(x-1);
            }
            return countx;
            }
            結(jié)果呢?

            答案:知道了這是統(tǒng)計(jì)9999的二進(jìn)制數(shù)值中有多少個(gè)1的函數(shù),且有
            9999=9×1024+512+256+15

            9×1024中含有1的個(gè)數(shù)為2;
            512中含有1的個(gè)數(shù)為1;
            256中含有1的個(gè)數(shù)為1;
            15中含有1的個(gè)數(shù)為4;
            故共有1的個(gè)數(shù)為8,結(jié)果為8。
            1000 - 1 = 0111,正好是原數(shù)取反。這就是原理。
            用這種方法來求1的個(gè)數(shù)是很效率很高的。
            不必去一個(gè)一個(gè)地移位。循環(huán)次數(shù)最少。

            6。int a,b,c 請(qǐng)寫函數(shù)實(shí)現(xiàn)C=a+b ,不可以改變數(shù)據(jù)類型,如將c改為long int,關(guān)鍵是如何處理溢出問題
            答案:bool add (int a, int b,int *c)
            {
            *c=a+b;
            return (a>0 && b>0 &&(*ca || *c>b)));
            }
            這里,第三個(gè)或條件沒看明白,覺得邏輯上出現(xiàn)不了啊。

            7。分析:
            struct bit
            { int a:3;
            int b:2;
            int c:3;
            };
            int main()
            {
            bit s;
            char *c=(char*)&s;
            cout< *c=0x99;
            cout << s.a < int a=-1;
            printf("%x",a);
            return 0;
            }
            輸出為什么是?

            答案:4
            1
            -1
            -4
            ffffffff
            因?yàn)?x99在內(nèi)存中表示為 100 11 001 , a = 001, b = 11, c = 100(在vc環(huán)境中,一般是由右到左進(jìn)行分配的)
            當(dāng)c為有符合數(shù)時(shí), c = 100, 最高1為表示c為負(fù)數(shù),負(fù)數(shù)在計(jì)算機(jī)用補(bǔ)碼表示,所以c = -4;同理
            b = -1;
            當(dāng)c為有符合數(shù)時(shí), c = 100,即 c = 4,同理 b = 3

            8。改錯(cuò):
            #include

            int main(void) {

            int **p;
            int arr[100];

            p = &arr;

            return 0;
            }

            答案:搞錯(cuò)了,是指針類型不同,
            int **p; //二級(jí)指針
            &arr; //得到的是指向第一維為100的數(shù)組的指針
            應(yīng)該這樣寫#include
            int main(void) {
            int **p, *q;
            int arr[100];
            q = arr;
            p = &q;
            return 0;

            9。下面這個(gè)程序執(zhí)行后會(huì)有什么錯(cuò)誤或者效果:
            #define MAX 255
            int main()
            {
            unsigned char A[MAX],i; //i被定義為unsigned char
            for (i=0;i<=MAX;i++)
            A[i]=i;
            }

            答案:死循環(huán)加數(shù)組越界訪問(C/C++不進(jìn)行數(shù)組越界檢查)
            MAX=255
            數(shù)組A的下標(biāo)范圍為:0..MAX-1,這是其一..
            其二.當(dāng)i循環(huán)到255時(shí),循環(huán)內(nèi)執(zhí)行:
            A[255]=255;
            這句本身沒有問題..但是返回for (i=0;i<=MAX;i++)語句時(shí),
            由于unsigned char的取值范圍在(0..255),i++以后i又為0了..無限循環(huán)下去.

            11。struct name1{
            char str;
            short x;
            int num;
            }

            struct name2{
            char str;
            int num;
            short x;
            }

            sizeof(struct name1)=??,sizeof(struct name2)=??

            答案:sizeof(struct name1)=8,sizeof(struct name2)=12
            在第二個(gè)結(jié)構(gòu)中,為保證num按四個(gè)字節(jié)對(duì)齊,char后必須留出3字節(jié)的空間;同時(shí)為保證整個(gè)結(jié)構(gòu)的自然對(duì)齊(這里是4字節(jié)對(duì)齊),在x后還要補(bǔ)齊2個(gè)字節(jié),這樣就是12字節(jié)。
              
            回復(fù)  更多評(píng)論
              
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久人妻AV中文字幕| 久久久久无码精品国产app| 久久中文骚妇内射| 久久久噜噜噜www成人网| 精品久久久久久久| 一本大道久久香蕉成人网| 少妇高潮惨叫久久久久久 | 久久综合九色综合网站| 97久久精品无码一区二区| 国产精品成人99久久久久 | 日批日出水久久亚洲精品tv| 一本久久免费视频| 国产一级持黄大片99久久| 一本久久a久久精品综合夜夜| 一本色道久久88综合日韩精品| 久久精品国产日本波多野结衣| 97久久久精品综合88久久| 久久这里有精品视频| 99久久99这里只有免费费精品| 久久久久香蕉视频| 无码人妻久久一区二区三区 | 精品久久久久久久久久中文字幕| 少妇无套内谢久久久久| 国产精品99久久不卡| 久久精品无码一区二区无码| 久久国产精品无码网站| 亚洲成色www久久网站夜月| 久久久久久一区国产精品| 国产精品久久久久无码av| 久久人人爽人人爽人人av东京热| 99久久人人爽亚洲精品美女| 蜜臀久久99精品久久久久久小说| 久久久久国产成人精品亚洲午夜| 精品熟女少妇av免费久久| 久久久噜噜噜久久中文字幕色伊伊| 91麻豆精品国产91久久久久久| 亚洲精品国精品久久99热一| 久久久久久av无码免费看大片| 国产Av激情久久无码天堂| 伊人久久综合成人网| 亚洲精品无码专区久久同性男|