2012-03-08 11 views
0

私はC++プログラムで、次の構造体を宣言した:異なるデータ型のsizeof(datatype_pointer)/ sizeof(datatype)の値が異なるのはなぜですか?

struct person { 
     char name[10];  /* first name */ 
     char id[10];  /* ID number */ 
     off_t pos;  /* position in file, for demonstration */ 
    } people[] = { 
     { "arnold", "123456789", 0 }, 
     { "miriam", "987654321", 10240 }, 
     { "joe", "192837465", 81920 }, 
    }; 

     j = sizeof(people)/sizeof(people[0]);  /* count of elements */ 

は、ここではJ = 3、すなわち、配列内の要素の全く与えません。いつもあなたが追加したり、要素を削減しても...

しかし

  char b[8]; 
     i = sizeof(b)/sizeof(b[0]); 

は、iの値が、私のマシン上の定数= 4 =与えます。

は、今はsizeof(人*)、とすぐに私は、構造体の人物を宣言としてはsizeof(char型*が)私のマシン上で一定であるとはsizeof(charは)あまりにも一定であるよう..

を正当化のthatsしかし、 sizeof(person)も定数でなければならず、一定の値を返さなければなりません。???

+2

私は 'char'バリアントがいつもあなたに4を与えるとは思わない...(http://ideone.com/eeniL) –

+0

私のマシンに4を与え、コードを実行しました。 sizeof(char *)はマシン上のアドレスを格納するのに必要なバイト数に依存し、sizeof(char)は常に1です。だから、私のマシン上のアドレスに対応するためには4 * sizeof(char)が必要です。 – bhuwansahni

+1

この投稿は、人々がなぜ完全なプログラムを投稿し、コードフラグメントでないのかを示す優れた例です。あなたの質問を示す最短の完全なプログラムを投稿してください。 http://sscce.org –

答えて

5

コンパイラが間違っています。

char b[8]; 
i = sizeof(b)/sizeof(b[0]); 

は、i==8である。

structサイズの結果は正しいです。もし私があなただったら私はコンパイラを切り替えます。

サイズを計算する関数にbを渡す場合は、正しいと思われます。しかし、コードが今のように、いいえ。

また、peopleをパラメータとして受け取った関数がsizeof(people)/sizeof(people[0])である場合、定数も得られます。

これは、引数として渡されたときに配列がポインタに崩壊するためです。

+0

私はMicrosoft Visual C++でコードを試してみました。 – bhuwansahni

4

実際にsizeofをポインタではなく配列に適用してもよろしいですか?このような場合には

あなたがi == sizeof(char*)を取得しますので、関数の引数は、実際にはポインタです:

void f(char b[8]) { 
    i = sizeof(b)/sizeof(b[0]); 
} 

あなたが投稿したコードは間違いなく、配列の要素数を与える必要があります。そうでなければ、あなたのコードには他に何か奇妙なものがあるか、コンパイラが絶望的に​​壊れています。

1
char b[8];   
    i = sizeof(b)/sizeof(b[0]); 

これは8の値のみを与えます。 sizeof(b)は、あなたが知覚するsizeof(char *)ではなく、配列のサイズを与えます。

関連する問題