1

私は試し(sizeof(array)/sizeof(array[0]))ました。動作しませんでした。私は簡単な関数を書きました:

int length(int array[]){
    int i=0;
    while(array[i]) i++;
    return i;
}

1分間は機能しましたが、次は機能しませんでした。

誰か助けてください!XcodeをIDEとして使用しています

4

5 に答える 5

3

配列の長さは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;
}
于 2012-11-15T05:41:38.360 に答える
1

配列を関数に渡すことは、ポインターを配列に渡すことと同じです。だからsizeof(array)/sizeof(array[0])動作しません。

グローバルマクロを定義できます。

#define A_LEN(a) (sizeof(a)/sizeof(a[0]))
于 2012-11-15T05:34:40.087 に答える
0

関数内の配列の長さを取得する方法はいくつかあります(同じファイルまたは異なるソースファイルに含めることができます)

  1. 配列の長さを個別のパラメーターとして渡します。
  2. extern関数がグローバルデータに直接アクセスできるように、配列の長さをグローバルにします
于 2012-11-15T05:55:57.783 に答える
0

これを試して

main()
{
int a[10] ;
printf("%d\n", sizeof(a)/sizeof(int) ) ;
}

output : 10 
于 2012-11-15T06:02:05.747 に答える
0

配列が関数のパラメーターである場合、sizeofが配列のサイズを適切に報告しないのはなぜですか?を参照してください。comp.lang.c FAQから、sizeofメソッドが機能しない理由を理解してください。おそらく、配列に関するセクション全体を読む必要があります。

関数に関してlengthは、「単純な」関数は、配列が.の値を持つ要素で終了するというセマンティクスを持っている場合にのみ0機能します。任意の配列では機能しません。配列がCでポインターに減衰した場合、配列のサイズを復元する方法はなく、配列の長さを渡す必要があります。(C標準ライブラリの関数でさえ免疫がありgetsません。宛先バッファの長さを指定する引数をとらないため、安全ではないことで有名です。宛先バッファのサイズを判別することは不可能であるため、バッファオーバーフローを防ぐことはできません。)

于 2012-11-15T06:15:40.023 に答える