1

重複の可能性:
関数引数の配列の長さ

整数配列の長さを取得しようとしていますが、正しい答えが得られません

void main()
{
    int x[]={33,55,77};
    printf("%d",getLength(x));//outputs 1
    printf("%d",sizeof(x)/sizeof(int));//outputs 3
}

int getLength(int *inp)
{
    return sizeof(inp)/sizeof(int);
}

では、なぜ getLength が 3 ではなく値 1 を返すのでしょうか?

4

3 に答える 3

3

配列はポインターではなく、ポインターは配列ではないためです。sizeof(pointer)と同じではありませんsizeof(the array which the pointer points to)

于 2013-01-15T16:16:56.833 に答える
2

配列はポインターに分解されるため、関数内で長さの計算を実行することはできません。関数は配列ではなくポインターを取得します。関数が出力するときと同じようにインラインで計算を行う3か、マクロを使用して配列の長さを計算する必要があります。

#define GET_LENGTH(inp) (sizeof(inp)/sizeof(*inp))

ideone のデモへのリンクを次に示します。

于 2013-01-15T16:16:57.287 に答える
1

ここsizeof(inp)では、配列のサイズではなくポインターのサイズとポインターのサイズを返しています= 4

そう

sizeof(inp)/sizeof(int)
 ^__ 4        ^__ 4      = 1
于 2013-01-15T16:16:48.603 に答える