私は試し(sizeof(array)/sizeof(array[0]))
ました。動作しませんでした。私は簡単な関数を書きました:
int length(int array[]){
int i=0;
while(array[i]) i++;
return i;
}
1分間は機能しましたが、次は機能しませんでした。
誰か助けてください!XcodeをIDEとして使用しています
配列の長さはCの配列の一部ではないため、配列をパラメーターとして関数に渡す場合は、その長さもパラメーターとして渡す必要があります。次に例を示します。
#define ARRLEN(a) (sizeof(a)/sizeof (a)[0]) /* a must be an array, not a pointer */
void printarray(int* a, int alen)
{
int i;
for (i = 0; i < alen; i++)
printf("%d\n", a[i]);
}
main()
{
int a[] = { 3, 4, 5 };
printarray(a, ARRLEN(a));
return 0;
}
ただし、配列が常に通常のデータではない番兵で終わるように定義されている場合は、番兵に遭遇するまで要素をトラバースできます。例えば、
void printstrings(char** a)
{
int i;
for (i = 0; a[i]; i++)
printf("%s\n", a[i]);
}
main()
{
char* a[] = { "This", "should", "work.", NULL };
printstrings(a);
return 0;
}
配列を関数に渡すことは、ポインターを配列に渡すことと同じです。だからsizeof(array)/sizeof(array[0])
動作しません。
グローバルマクロを定義できます。
#define A_LEN(a) (sizeof(a)/sizeof(a[0]))
関数内の配列の長さを取得する方法はいくつかあります(同じファイルまたは異なるソースファイルに含めることができます)
extern
関数がグローバルデータに直接アクセスできるように、配列の長さをグローバルにしますこれを試して
main()
{
int a[10] ;
printf("%d\n", sizeof(a)/sizeof(int) ) ;
}
output : 10
配列が関数のパラメーターである場合、sizeofが配列のサイズを適切に報告しないのはなぜですか?を参照してください。comp.lang.c FAQから、sizeof
メソッドが機能しない理由を理解してください。おそらく、配列に関するセクション全体を読む必要があります。
関数に関してlength
は、「単純な」関数は、配列が.の値を持つ要素で終了するというセマンティクスを持っている場合にのみ0
機能します。任意の配列では機能しません。配列がCでポインターに減衰した場合、配列のサイズを復元する方法はなく、配列の長さを渡す必要があります。(C標準ライブラリの関数でさえ免疫がありgets
ません。宛先バッファの長さを指定する引数をとらないため、安全ではないことで有名です。宛先バッファのサイズを判別することは不可能であるため、バッファオーバーフローを防ぐことはできません。)