2012-07-25 26 views
-1

如果機器是32位little-endianess並且sizeof(int)是4字節。以下哪項是以下程序的正確輸出?

考慮下面的程序:

line1: #include<stdio.h> 
line2: { 
line3:  int arr[3]={2,3,4}; 
line4:  char *p; 
line5:  p=(char*)arr; 
line6:  printf("%d",*p); 
line7:  p=p+1; 
line8:  printf("%d\n",*p); 
line9:  return 0; 
     } 

什麼是預期的輸出?

A:2 3

B:2 0

C:1 0

D:垃圾值

一件事困擾我的整數指針的澆鑄到一個字符指針。

  1. 該鑄件有多重要?

  2. 編譯器在第5行做什麼? (p = (char *) arr;

  3. 第7行發生了什麼? (p = p + 1

  4. 如果輸出是20那麼0是如何打印出來的?

+0

@EricJ。其實我編譯它在我的機器上,並得到2 0作爲輸出? – kTiwari 2012-07-25 15:27:59

+0

在SPARC或其他big-endian機器上編譯它,你應該得到'00' - 這個代碼的行爲是依賴於平臺和編譯器的。 – twalberg 2012-07-25 15:31:45

+1

這個問題沒有意義,因爲無論是endianess還是編譯器,也沒有提到'sizeof(int)'。 – RedX 2012-07-25 15:32:23

回答

0

1.重要鑄件: - char * p; 這行聲明瞭一個指向字符的指針。這意味着它的屬性是可以一次只取消一個字節的 ,並且位移也是一個字節。

p =(char *)arr; 2.類型轉換爲char *僅用於避免編譯器發出警告。 如果你不那麼也是同樣的行爲。

  1. 作爲指針爲一個字符作爲我已經寫以上P = P + 1個指向下一個字節

  2. 的printf( 「%d \ n」,* P); %d正在將該值格式化爲十進制整數,因此十進制格式顯示爲 ,這裏使用* p,並根據其屬性可以僅引用一個字節。因此現在內存組織進入畫面。 那是你的機器如下小端/ LSB第一或大端/ MSB第一

    按你答你的機器跟着小endian.So第一次你答是0 然後下一個字節必須是零,因此輸出爲0 。 二進制: 2表示爲00-00-00-02(字節明智表示) 但在內存中它存儲在像第一存儲器字節02 02-00-00-00四個字節這樣

    並在第二個存儲器字節00

1
  1. (D),或編譯器特異性的,因爲sizeof(int)(以及字節順序)是依賴於平臺的。

鑄件有多重要?

整體而言,Casting是C語言中不可或缺的一部分(雙關語)。

以及在第5行中compilar會做什麼?

它將arr的第一個元素的地址放到p中。

和行號5之後行號7是怎麼回事?

它增加指針,使其指向該內存地址的下一個char

如果輸出是2 0那麼編譯器如何打印0?

這是一個結合的恩典和sizeof(int)。如果沒有你機器的規格,我可以做的其他事情就不用解釋了。

然而,假設小端和sizeof(int) == 4,我們可以看到以下內容:

// lets mark these memory regions: |A|B|C|D| 
int i = 2; // represented as  0x02000000 
char *ptr = (char *) &i; // now ptr points to 0x02 (A) 
printf("%d\n", *ptr); // prints '2', because ptr points to 0x02 (A) 
ptr++; // increment ptr, ptr now points to 0x00 (B) 
printf("%d\n", *ptr); // prints '0', because ptr points to 0x00 (B) 
+0

我欣賞你的所有答案,除了最後一個爲什麼零(0)正在被編譯器打印。可能會更加強調 – kTiwari 2012-07-25 15:29:24

+0

@krishnaChandra因爲在內存中(小端),「2」表示爲「0x0200」,並且第一次打印指針時,結果爲「2」(0x02)。當你增加指針時,你會得到下一個字節「0x00」。 – 2012-07-25 15:32:30

1

(E)上述均不

然而,條件是:(一)你是在一個小端(例如x86)和(b)sizeof(int) >= 2,這應該打印「20」(兩個之間不打印空間)。

a)所述鑄造是「必要的」在一個時間,而不是作爲一系列int小號

b鍵讀取陣列的一個字節)這只是強迫所述第一int的地址轉換成指針char

c)按sizeof(char)遞增存儲在p的地址(其爲1)

d)的int的機器表示的第二個字節是由管線8

印刷