0

重複の可能性:
C プログラミング言語の配列のサイズ?

私のメイン関数には、次のコードがあります。

struct student s1 = {"zack",0,0,82};
struct student s2 = {"bob",0,0,80};
struct student s3 = {"joe",0,0,97};
struct student s4 = {"bill",0,0,100};

struct student c[] = {s1,s2,s3,s4};

printf("%d\n\n", arrayLengths(c));
printf("%d\n\n", sizeof(c)/sizeof(c[0]));

arrayLength は次のように定義されます。

int arrayLengths(struct student g[]) {
    return sizeof(g)/sizeof(g[0]);
}

重複したコードを使用すると、2 つの異なる結果が得られます。私のコンソール出力は次のとおりです。

0
4

何を与える?なぜそうなのか、どうすればこれを独自の機能に入れることができますか?

4

3 に答える 3

2

配列が関数に渡されると、配列の最初の要素を指すポインターに減衰します。そう:

int arrayLengths(struct student g[]) {
    return sizeof(g)/sizeof(g[0]);
}

実際には:

int arrayLengths(struct student* g) {
    return sizeof(struct student*)/sizeof(struct student);
}
于 2012-05-18T09:16:12.663 に答える
1

内部のコードはarrayLengthsどのようにして配列の大きさを知るのでしょうか?

于 2012-05-18T09:15:59.430 に答える
0

関数に渡された配列は、ポインターに崩壊します。ポインターのサイズは通常、32 ビット システムでは 4 バイトです。

一方、メイン関数の配列のサイズは次のようになります

sizeof(array element type) * (number of elements in the array)

これは、あなたが見ている動作を説明するはずです。

于 2012-05-18T09:18:56.390 に答える