青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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)中的重要部分,兩三句話恐怕誰(shuí)也說不清楚吧~~
我先說個(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)存管理有塊式管理,頁(yè)式管理,段式和段頁(yè)式管理。現(xiàn)在常用段頁(yè)式管理

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

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

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

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

各種內(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語(yǔ)言中兩種if語(yǔ)句判斷方式。請(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語(yǔ)言是結(jié)構(gòu)化編程語(yǔ)言,C++是面向?qū)ο缶幊陶Z(yǔ)言。
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語(yǔ)言中的sizeof

一、sizeof的概念 
  sizeof是C語(yǔ)言的一種單目操作符,如C語(yǔ)言的其他操作符++、--等。它并不是函數(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語(yǔ)句返回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語(yǔ)句。

建表
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 閱讀(695) 評(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++)語(yǔ)句時(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年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(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)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            麻豆精品传媒视频| 国产精品激情电影| 亚洲三级视频| 久久精品国产2020观看福利| 99国产精品视频免费观看| 国产日韩亚洲欧美综合| 国产欧美一区二区三区在线老狼| 欧美午夜精品理论片a级按摩| 欧美日韩精品系列| 国产精品免费一区二区三区在线观看| 国产精品久久久久av| 国产日韩精品一区二区| 一区二区三区在线看| 亚洲国产成人精品久久| 亚洲调教视频在线观看| 亚洲综合日韩| 久久亚洲国产精品日日av夜夜| 美国成人直播| 亚洲黄色性网站| 99在线热播精品免费99热| 一本一本大道香蕉久在线精品| 亚洲午夜在线观看视频在线| 久久黄色小说| 欧美日韩视频在线| 日韩视频在线一区二区| 亚洲精品日韩在线观看| 日韩视频一区二区| 亚洲午夜久久久| 久久精品99久久香蕉国产色戒| 欧美成人69av| 国产日本亚洲高清| 99re66热这里只有精品4 | 国产一二三精品| 亚洲激情一区二区| 香蕉成人啪国产精品视频综合网| 牛牛精品成人免费视频| 午夜精品婷婷| 欧美成人免费一级人片100| 在线视频中文亚洲| 欧美成人首页| 一区二区三区在线视频免费观看| 亚洲一区二区三区在线看| 欧美成人精品不卡视频在线观看 | 欧美久久九九| 影音国产精品| 欧美中文在线观看国产| 亚洲美女电影在线| 美女黄网久久| 欲香欲色天天天综合和网| 亚洲欧美日韩国产一区二区三区 | 国产女主播一区二区三区| 一本到高清视频免费精品| 美女国产精品| 久久久久久日产精品| 国产午夜精品视频免费不卡69堂| 亚洲在线一区二区三区| 亚洲美女区一区| 欧美美女操人视频| 99精品99| 99精品99久久久久久宅男| 欧美日韩一区国产| 亚洲一区二区三区在线播放| 亚洲色无码播放| 国产精品午夜国产小视频| 亚洲欧美成人在线| 亚洲午夜精品在线| 国产日韩欧美在线观看| 欧美自拍偷拍| 久久久高清一区二区三区| 激情欧美日韩| 免费久久99精品国产| 蜜桃av一区二区| 99日韩精品| 国产精品99久久久久久久久久久久 | 欧美四级在线观看| 亚洲国产成人不卡| 久久综合网络一区二区| 国产一区视频观看| 欧美一区二区免费视频| 性欧美暴力猛交69hd| 欧美视频一区二区三区在线观看| 亚洲一级黄色| 欧美在线91| 亚洲国产精品热久久| 亚洲欧洲日本mm| 国产精品激情偷乱一区二区∴| 欧美亚洲一区二区在线观看| 久久riav二区三区| 亚洲精选成人| 亚洲欧美日本另类| 亚洲国产精品久久久久秋霞蜜臀| 亚洲第一福利在线观看| 欧美激情欧美激情在线五月| 国产精品99久久久久久久vr| 午夜精品亚洲| 亚洲巨乳在线| 欧美亚洲在线观看| 亚洲精品视频在线观看免费| 亚洲一区日韩在线| 亚洲电影天堂av| 一区二区三区毛片| 亚洲高清在线| 亚洲欧美一区二区三区久久| 亚洲精品国产欧美| 亚洲欧美一级二级三级| 亚洲另类一区二区| 午夜精品www| 一本色道88久久加勒比精品| 久久精品欧美日韩| 亚洲欧美在线网| 欧美不卡一区| 久久亚洲私人国产精品va| 欧美片在线播放| 久久婷婷国产综合尤物精品| 国产精品久久久久久久久久直播 | 久久丁香综合五月国产三级网站| 久久综合狠狠综合久久激情| 亚洲天堂男人| 裸体一区二区| 欧美综合77777色婷婷| 欧美区一区二| 免费成人美女女| 国产欧美日韩精品一区| 日韩午夜av| 99av国产精品欲麻豆| 欧美在线看片| 亚洲自拍电影| 欧美日韩一区二区在线播放| 亚洲电影免费在线观看| 激情综合色综合久久| 亚洲午夜精品久久久久久app| 99精品99| 欧美日韩ab片| 99在线|亚洲一区二区| 99伊人成综合| 欧美日产在线观看| 亚洲人成亚洲人成在线观看图片 | 亚洲精品国精品久久99热一| 欧美亚洲专区| 久久se精品一区精品二区| 国产精品美腿一区在线看| 在线视频精品一区| 亚洲欧美成人一区二区在线电影| 欧美视频免费在线观看| 亚洲最新视频在线播放| 亚洲一区二区三区免费在线观看| 欧美日韩一区二区高清| 9国产精品视频| 午夜精品久久久久久99热软件| 国产精品豆花视频| 亚洲欧美国产精品专区久久| 久久se精品一区精品二区| 激情六月婷婷久久| 欧美激情精品久久久久久大尺度 | 亚洲自拍另类| 国产精品久久国产三级国电话系列| 99在线|亚洲一区二区| 一级日韩一区在线观看| 欧美日韩在线视频观看| 一区二区三区日韩精品| 午夜精品久久久久影视| 国产精品揄拍500视频| 欧美在线观看视频一区二区三区| 久久综合婷婷| 激情成人av| 欧美日韩妖精视频| 亚洲欧美精品suv| 狼狼综合久久久久综合网| 亚洲第一区在线| 欧美激情一区二区久久久| 日韩亚洲欧美中文三级| 久久九九国产精品| 日韩视频三区| 国产一区二区按摩在线观看| 久久久久免费| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 校园春色国产精品| 国产专区欧美专区| 欧美久久久久免费| 亚洲欧美日韩一区二区三区在线观看| 欧美一级久久久久久久大片| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲免费视频网站| 亚洲高清在线观看| 欧美在线视频全部完| 亚洲精品视频免费| 国产一区二区三区奇米久涩| 欧美日韩国产另类不卡| 久久精品成人| 亚洲欧美制服中文字幕| 亚洲免费播放| 亚洲国产精品va在看黑人| 久久精品国产v日韩v亚洲| 久久久久国产精品人| 国产在线麻豆精品观看| 欧美福利视频在线| 久久精品国产综合精品| 亚洲一区二区网站| 日韩亚洲欧美中文三级| 91久久精品国产91久久性色tv|