Intel和微軟同時出現的C語言面試題

來源:互聯網
上載者:User
 Intel和微軟同時出現的C語言面試題

  #pragma pack(8)

  struct s1{
  short a;
  long b;
  };

  struct s2{
  char c;
  s1 d;
  long long e;
  };

  #pragma pack()

  問
  1.sizeof(s2) = ?
  2.s2的s1中的a後面空了幾個位元組接著是b?

  如果您知道答案請在討論中寫出,以下是部份網友的答案,供參考:

  網友rwxybh(行雲)的答案:
  記憶體布局是
  1*** 11**
  1111 ****
  1111 1111

  所以答案就是24和3

  下面是一個測試的程式,試一試就知道了,我用的是VC2005

  #pragma pack(8)

  struct s1{
  short a; // 2 BYtes
  long b; // 4 Bytes
  };
  struct s2{
  char c; // 1 Byte
  s1 d; // 8 Bytes
  long long e; // 8 Bytes
  };
  // 1*** 11**
  // 1111 ****
  // 1111 1111
  //

  // 00 01 02 03 04 05 06 07
  // 00 01 02 03 04 05 06 07
  // 00 01 02 03 04 05 06 07
  //
  #pragma pack()

  int main(int argc, char* argv[])
  {
  s2 a;
  char *p = (char *)&a;
  for(int i=0;i<24;++i)
  p[i] = (char)(i%8);
  printf("%d/n",sizeof(a));
  printf("c=0x%lx/n",a.c);
  printf("d.a=0x%x/n",a.d.a);
  printf("d.b=0x%x/n",a.d.b);
  printf("e=0x%llx/n",a.e);
  return 0;
  }
  結果:
  24
  c=0x0
  d.a=0x504
  d.b=0x3020100
  e=0x706050403020100

  網友 redleaves (ID最吊的網友)的答案和分析:

  如果代碼:
  #pragma pack(8)
  struct S1{
  char a;
  long b;
  };
  struct S2 {
  char c;
  struct S1 d;
  long long e;
  };
  #pragma pack()
  sizeof(S2)結果為24.
  成員對齊有一個重要的條件,即每個成員分別對齊.即每個成員按自己的方式對齊.
  也就是說上面雖然指定了按8位元組對齊,但並不是所有的成員都是以8位元組對齊.其對齊的規則是,每個成員按其類型的對齊參數(通常是這個類型的大小)和指定對齊參數(這裡是8位元組)中較小的一個對齊.並且結構的長度必須為所用過的所有對齊參數的整數倍,不夠就補空位元組.

  S1中,成員a是1位元組預設按1位元組對齊,指定對齊參數為8,這兩個值中取1,a按1位元組對齊;成員b是4個位元組,預設是按4位元組對齊,這時就按4位元組對齊,所以sizeof(S1)應該為8;
  S2中,c和S1中的a一樣,按1位元組對齊,而d 是個結構,它是8個位元組,它按什麼對齊呢?對於結構來說,它的預設對齊就是它的所有成員使用的對齊參數中最大的一個,S1的就是4.所以,成員d就是按4位元組對齊.成員e是8個位元組,它是預設按8位元組對齊,和指定的一樣,所以它對到8位元組的邊界上,這時,已經使用了12個位元組了,所以又添加了4個位元組的空,從第16個位元組開始放置成員e.這時,長度為24,已經可以被8(成員e按8位元組對齊)整除.這樣,一共使用了24個位元組.
  a b
  S1的記憶體布局:11**,1111,
  c S1.a S1.b d
  S2的記憶體布局:1***,11**,1111,****11111111

  這裡有三點很重要:
  1.每個成員分別按自己的方式對齊,並能最小化長度
  2.複雜類型(如結構)的預設對齊是它最長的成員的對齊,這樣在成員是複雜類型時,可以最小化長度
  3.對齊後的長度必須是成員中最大的對齊參數的整數倍,這樣在處理數組時可以保證每一項都邊界對齊

  網友xue23(xue23) 的答案和分析:

  有程式查一下各個變數的記憶體位址得知:
  各個變數在記憶體中的位置為
  c***aa**
  bbbb****
  dddddddd
  測試代碼為:
  s2 ss;
  cout << "ss.c = " << &ss << endl ;
  cout << "ss.d.a = " <<&ss.d.a << endl;
  cout << "ss.d.b = " <<&(ss.d.b) <  cout << "ss.d = " <<&ss.e << endl;
  print out 各個變數的記憶體位址不就可以看出來了嗎。

  所以答案是24,2.

  但是我的想像中應該是這樣的分布情況:
  c*******
  aa**bbbb
  dddddddd

  不知為什麼會c和a放在一起,組成8位長度。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.