113

パラメータとして送信される配列のサイズがメイン内と同じでないのはなぜですか?

#include <stdio.h>

void PrintSize(int p_someArray[10]);

int main () {
    int myArray[10];
    printf("%d\n", sizeof(myArray)); /* As expected, 40 */
    PrintSize(myArray);/* Prints 4, not 40 */
}

void PrintSize(int p_someArray[10]){
    printf("%d\n", sizeof(p_someArray));
}
4

13 に答える 13

107

配列型は、関数に渡すときに暗黙的にポインタ型に変換されます。

それで、

void PrintSize(int p_someArray[10]) {
    printf("%zu\n", sizeof(p_someArray));
}

void PrintSize(int *p_someArray) {
    printf("%zu\n", sizeof(p_someArray));
}

同等です。だからあなたが得るものはの価値ですsizeof(int*)

于 2009-12-29T15:14:19.343 に答える
20

これはポインターです。そのため、配列のサイズを関数の 2 番目のパラメーターとして渡すのが一般的な実装です。

于 2009-12-29T17:23:50.407 に答える
16

他の人が述べたように、配列は、関数パラメーターとして使用されると、最初の要素へのポインターに減衰します。また、 sizeof は式を評価せず、式で使用する場合は括弧を必要としないため、パラメーターは実際にはまったく使用されないため、値ではなく型で sizeof を記述した方がよいことにも注意してください。

#include <stdio.h>

void PrintSize1 ( int someArray[][10] );
void PrintSize2 ( int someArray[10] );

int main ()
{
    int myArray[10];
    printf ( "%d\n", sizeof myArray ); /* as expected 40 */
    printf ( "%d\n", sizeof ( int[10] ) ); /* requires parens */
    PrintSize1 ( 0 ); /* prints 40, does not evaluate 0[0] */
    PrintSize2 ( 0 ); /* prints 40, someArray unused */
}

void PrintSize1 ( int someArray[][10] )
{
    printf ( "%d\n", sizeof someArray[0] );
}

void PrintSize2 ( int someArray[10] )
{
    printf ( "%d\n", sizeof ( int[10] ) );
}
于 2009-12-29T17:21:31.303 に答える
5

配列は、パラメーターとして渡されるときにポインターに減衰するためです。これがCの仕組みですが、参照によってC ++で「配列」を渡し、この問題を克服することができます。この関数には、さまざまなサイズの配列を渡すことができることに注意してください。

 // 10 is superfluous here! You can pass an array of different size!
void PrintSize(int p_someArray[10]);
于 2009-12-29T15:15:21.110 に答える
5

C++ では、まさにこの目的のために参照によって配列を渡すことができます。

void foo(int (&array)[10])
{
    std::cout << sizeof(array) << "\n";
}
于 2010-06-23T09:34:41.730 に答える
3

配列を関数に渡すことはできません。

本当にサイズを出力したい場合は、配列へのポインターを渡すことができますが、関数の配列サイズも定義する必要があるため、一般的ではありません。

#include <stdio.h>

void PrintSize(int (*p_anArray)[10]);

int main(void) {
    int myArray[10];
    printf("%d\n", sizeof(myArray)); /* as expected 40 */
    PrintSize(&myArray);/* prints 40 */
}

void PrintSize(int (*p_anArray)[10]){
    printf("%d\n", (int) sizeof(*p_anArray));
}
于 2009-12-29T15:44:45.760 に答える
3

C言語では、不明な配列のサイズを判別する方法がないため、数量と最初の要素へのポインターを渡す必要があります。

于 2009-12-29T15:16:56.797 に答える
0

動作は仕様によるものです。

関数パラメーター宣言の構文が同じであるということは、ローカル変数の定義とはまったく異なることを意味します。

その理由は他の回答に記載されています。

于 2009-12-29T15:17:23.550 に答える
-1

「C」プログラミング言語では、「sizeof()」が演算子であり、オブジェクトのサイズをバイト単位で返します。「sizeof()」演算子の引数は、左辺値型 (整数、浮動小数点数、構造体、配列) である必要があります.したがって、配列のサイズをバイト単位で知りたい場合は、非常に簡単に行うことができます.'sizeof()'演算子を使用し、引数に配列名を使用するだけです.例:

#include <stdio.h>

main(){

 int n[10];
 printf("Size of n is: %d \n", sizeof(n)); 

}

32 ビット システムでの出力は次のようになります: n のサイズは 40 です。 int)」。

いくつかのヒント:

この 'int n[]={1, 2, 3, ...155..};' のように宣言された配列があるとします。したがって、この配列に格納されている要素の数を知りたいのです。次のアルゴリズムを使用します。

sizeof(name_of_the_array) / sizeof(array_type)

コード: #include

主要(){

int n[] = { 1, 2, 3, 44, 6, 7 };
printf("Number of elements: %d \n", sizeof(n) / sizeof(int));
return 0;

}

于 2016-06-11T00:17:46.083 に答える
-3

配列のサイズは大まかなものにすぎません。ほとんどの場合、配列はメモリへのポインタです。宣言のサイズは、配列に割り当てるメモリの量をコンパイラに通知するだけです。これは型に関連付けられていないため、sizeof()は何も実行しません。

于 2009-12-29T15:15:19.347 に答える