dポイントプレゼントキャンペーン実施中!

二次元配列、三次元配列のサイズが知りたいです。

unsigned char test1[100];
は sizeof( test1 )で100ですが、

unsigned char test1[100][30];
はどのように書いたら100または、30なのか知りたいです。

unsigned char test1[100][30][5];
これも100,30,5のサイズをそれぞれ得る方法が知りたいです。

因みに以下のような数値なし[]を見たことがあるのですが
どういう意味でしょうか?
unsigned char test1[][30];

サイズを理解していないのは、ポインタを理解していないと同じことでしょうか?今更ながら自分自身が不安です。

A 回答 (14件中11~14件)

まず、配列の添え字付け、すなわちarray[s]は*(array+s)と等価になります。

そして、array+sの部分ですが、ポインタと整数型の加算の結果が、配列オブジェクトの要素または配列オブジェクトの最後の要素を越えたところを指すことはできますが、それ以外の場合(オーバーフローを生じた場合)の動作は未定義なります。

次に、*演算子ですが、オペランドであるポインタの値が正しくない場合の動作は未定義になります。この場合の「正しくない値」というのは、「配列オブジェクトの最後の要素を越えたところ」も含むと思われます。

sizeof演算子は、可変長配列でない限りオペランドを評価しません。未定義の動作は必ずしも実行時のことだけではなく、コンパイル時にエラーやその他の誤動作を生じてもおかしくはないのですが、*演算子のオペランドの値が正しいかどうかは評価されなければわからないので、これはないはずです。結果としてsizeof ary[100]は問題ないと思いますが、見た人を困惑させるには十分な表現ですので、避けるべきでしょうね。
    • good
    • 0

C言語の仕様上は、配列の添え字として、配列の定義外を使ってはいけないという制限はなかったような。


例えば、
unsigned char test[100];
という配列があったとして、
test[100]
とか、
test[120]
とか、
test[-1]
とかも(言語の仕様上は)有効なはず。

ただ、普通は、こういうアクセスをするとメモリ破壊になるからやってはいけない、ってだけだったと思います。
だから、sizeof(test[100])は、OKだと思う。
今、言語仕様が手元にないので、もしかしたら、間違ったことを言っているかもしれませんが。
    • good
    • 0

No.1さんの回答は、sizeofのところで配列の定義外の添字を使っているために破綻します。


正しくは下のとおりです。


#include <stdio.h>

int main(void)
{
  unsigned char test1[100];
  unsigned char test2[100][30];
  unsigned char test3[100][30][5];
  
  printf("%d\n", sizeof(test1) / sizeof(test1[0]));
  putchar('\n');
  printf("%d\n", sizeof(test2) / sizeof(test2[0]));
  printf("%d\n", sizeof(test2[0]) / sizeof(test2[0][0]));
  putchar('\n');
  printf("%d\n", sizeof(test3) / sizeof(test3[0]));
  printf("%d\n", sizeof(test3[0]) / sizeof(test3[0][0]));
  printf("%d\n", sizeof(test3[0][0]) / sizeof(test3[0][0][0]));
  return 0;
}

(注)インデントのため、全角空白を使っています。
    • good
    • 0

えーとこういう答えがお望み?



#include <stdio.h>

unsigned char ary[100][30][5];
int
main()
{
printf("%d\n", sizeof ary / sizeof ary[100]);
printf("%d\n", sizeof ary[100] / sizeof ary[100][30]);
printf("%d\n", sizeof ary[100][30]) / sizeof ary[100][30][5];

return 0;
}
bash-3.2$ gcc size.c
bash-3.2$ ./a
100
30
5


> 因みに以下のような数値なし[]を見たことがあるのですが
> どういう意味でしょうか?
> unsigned char test1[][30];

配列の「定義」ではなく「宣言」の場合は最上位の次元を省略することが
許されます。
で、それをしているだけ。
関数の引数に多次元配列を渡すときのプロトタイプとかで使いますね。

> サイズを理解していないのは、ポインタを理解していないと同じことでしょうか?

Cにおいて配列とポインタはしばしば互換性を持っていますが、
別物です。同じことではないでしょう。
Cの理解が足りないという意味では同じかもしれませんが。
    • good
    • 0
この回答へのお礼

sakusaker7さんのような、はっきり物を言われる方の議論は、
非常にためになります。

今後とも、よろしくお願いします。

お礼日時:2007/08/01 09:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!