-1

マシンが 32 ビットのリトル エンディアンであり、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つ。

  1. キャスティングってそんなに重要?

  2. コンパイラは 5 行目で何をしていますか? ( p = (char *) arr;)

  3. 7行目で何が起こっているのですか?( p = p + 1)

  4. 出力が次の場合、20どのよう0に印刷されていますか?

4

3 に答える 3

1
  1. (D)、またはコンパイラ固有、sizeof(int)(およびエンディアンネス)はプラットフォームに依存します。

キャスティングはどれほど重要ですか?

キャストは、全体として、C言語の不可欠な(意図しないしゃれ)部分です。

コンパイラは5行目で何をしますか?

の最初の要素のアドレスを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)
于 2012-07-25T15:26:24.510 に答える
1

(E) 上記のいずれでもない

ただし、(a) リトルエンディアン マシン (x86 など) を使用している場合、および (b)sizeof(int) >= 2は "20" と出力されます (2 つの間にスペースは出力されません)。

a) キャストは、一連のintsとしてではなく、一度に 1 バイトずつ配列を読み取るために「必要」です。

b)これは、最初のアドレスをintポインタに強制するだけですchar

c) に格納されているアドレスをインクリメントしますp(sizeof(char)これは 1 です)

d) のマシン表現の 2 番目のバイトがint8 行目に出力されます。

于 2012-07-25T15:28:58.047 に答える
0

1.キャストの重要性:-char * p; この行は、文字へのポインタを宣言します。つまり、そのプロパティは、一度に1バイトしか参照解除できず、変位も1バイトです。

p =(char *)arr; 2. char *への型キャストは、コンパイラによる警告を回避するためだけのものです。そうしないと、同じ動作になります。

  1. 私がすでに上に書いた文字へのポインタとしてp=p+1次のバイトを指す

  2. printf( "%d \ n"、* p); %dは値を10進整数にフォーマットしているため、ここに示す10進フォーマット* pが使用され、そのプロパティに従って1バイトのみを逆参照できます。これでメモリ構成がわかります。つまり、マシンはリトルエンディアン/LSBファーストまたはビッグエンディアン/MSBファーストに従います

    あなたのansに従って、あなたのマシンはリトルエンディアンに従います。したがって、最初はあなたのansは0です。次に次のバイトはゼロでなければならないので、出力は0です。バイナリでは:2は00-00-00-02(バイト単位の表現)として表されますが、メモリ内にあります。 02-00-00-00のように4バイトこのように格納されます

    最初のメモリバイト02と2番目のメモリバイト00

于 2012-07-26T20:07:02.690 に答える