プロが教える店舗&オフィスのセキュリティ対策術

配列の中にいくつ要素があるか後から調べる方法はあるでしょうか?

int test[4][3] = {
  {0,1,2},
  {0,1,2},
  {0,1,2},
  {0,1,2},
} ;

上のケースだと、X方向に3、Y方向に4つの
要素があります。しかし、これだとあらかじめいくつ要素があるかを決めて
置かないといけません。



例えば、

int test[] = {0,1,2,3....}

みたいに宣言された場合や、

char *test[] = {
  "ああああああ",
  "いいいいいい",
  "うううううう",
     ・
     ・
//(これは文字列の数を要素数とします)
} ;

のように宣言された二次元配列などで、後から配列内にいくつ要素があるかを
調べることなどは可能でしょうか?

A 回答 (4件)

一次元の場合、sizeof test/sizeof *test


二次元の場合、sizeof test/sizeof **test

sizeof test/sizeof(int)
のように括弧に囲んで要素の型を書いてもいいです。
Cの入門書に載っていると思いますよ。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
やはりsizeofでしたか。

こういうやり方でもsizeofが使えるとは全然思いつきませんでした。
早速試してみます。

それにしてもC言語は奥が深いですね。。

お礼日時:2006/12/31 00:00

よくやるやり方では、



char test[] = {0,1,2,3,0xFF};

と書いて0xFFを番兵として使うとか。具体的には
for(i=0; 0xFF!=test[i]; i++)
 ;
というループを回した後出てくる i が配列の要素数です。
上記の例では、i=4のときtest[4]==0xFFとなり、配列の(使いたい)要素数が4個であることが分かります。

char *test[] = {
"ああああ",
"いいいい",
"うううう",
NULL
};

でも
for(i=0; NULL!=test[i]; i++)
 ;
で同じこと。

このやり方を応用すれば、

#define COMMAND_STRING_SIZE6
typedef void (*func)(void);
typedef struct {
charcommandString[COMMAND_STRING_SIZE];
funccommandFunction;
} FUNCTIONMENU;

void func1(void){puts("hogeです。");}
void func2(void){puts("fugaです。");}

FUNCTIONMENUmenuTable[] = {
{"hoge",func1},
{"fuga",func2},
{"quit",NULL},
{NULL,NULL}
};

という感じで、コマンド入力に対して実行する関数をテーブル管理する際に、コマンドを増やすのはテーブルに追加するだけで済みます。

Javaなら、配列名.length(); で一発なんですけどね~
    • good
    • 0
この回答へのお礼

すみません。皆さん回答ありがとうございます。
しばらくネットができなかったのでお礼がおくれました。

お礼日時:2007/02/07 02:23

前の回答者様も軽く触れられていましたが、sizeofの使い方には注意が必要です。



int a[] = {1,2,3,4,5,6,7,8};
int *b = NULL;
b = (char*)a;

ここで、sizeof(a/a[0])とsizeof(b/b[0])がそれぞれどのような値になるか確かめてください。なんでそうなるかは、型に注意してよく考えてみてください。

上の問題は、ローカル定義の配列をパラメータで渡すように変更した場合にありがちなバグを引き起こします。

C言語の場合には、使用しているメモリのサイズは明示的に管理すべできです。つまり、

#define MAX_A (8)
#define SENTITIES (-1)
...
int array[MAX_A+1] = {1,2,3,4,5,6,7,8, SENTITIES};
rc = func( (int*)array, MAX_A );
if ( 0 != rc ) {
  //エラー処理
}
...
int func( int* array, int num ) {

  int cnt;

  assert( NULL != array );
  assert( SENTITIES == *(array+num) );

  for ( cnt = 0 ; cnt < num ; cnt++ ) {
    ...
  }
  ...
}

最後に尖兵をつけて、妥当性検査(最低限アサーション)を行っておくと、よい(防衛的な)プログラミングになります。

他の言語でもそうですが、特にC言語ではこのように明示的に管理するプログラミングの癖をつけておけるかどうかが、品質と生産性に大きく影響してきます。
    • good
    • 0

#define ArraySizeOf(array) (sizeof(array) / sizeof(array[0]))



↑任意の配列 array[] の要素数を返すマクロです.
こういうのを作っておくと便利です.
ご質問の例だと,

int test[] = { … };
int i;

for(i = 0; i < ArraySizeOf(test); i++)
  printf("…", test[i]);

のように使えます.

念のためにいっておきますが,array は配列でなければならず,配列へのポインタではだめです.
また,ArraySizeOf() は関数にはできません.
(たまに間違えてる人を見かけるので.)

参考URL:http://www5d.biglobe.ne.jp/~noocyte/Programming/ …
    • good
    • 0

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