1

sizeof パラメータを使用して、作成した後に配列のサイズを検出する方法を知っています。

int arr[10];
printf("%i",sizeof(arr)/sizeof(int));

しかし、私が理解しているように、配列をパラメーターとして関数に渡すと、実際の配列ではなく、配列の最初の要素へのポインターを実際に渡します。したがって、sizeof 演算子を使用すると、ポインターのサイズが取得されます。

「\0」を検索することで、文字列 (char 配列) のサイズを見つけることができることを知っています。では、int 配列について話していると仮定しましょう。

引数として渡された配列のサイズを検出するにはどうすればよいですか?

4

7 に答える 7

1

できません。ディメンションを追加のパラメーターとして関数に送信する必要があります。

于 2013-04-08T16:01:27.000 に答える
1

You can't. In C, when you pass an array to function, it decays from an array to a pointer-to-type, so far as the function's scope is concerned.

So, consider this:

int arr[16];
sizeof(arr);          // sizeof WORKS
myFunction(arr);      // Array decays to pointer, sizeof FAILS inside function
myFunction(&arr[0]);  // Array decays to pointer, sizeof FAILS inside function

void myFunction(int* ptr)
{
  // sizeof(ptr) will not give you what you would expect normally
}

The traditional way to do this in C is to have an extra function parameter, ie:

void myFunction(int* ptr, size_t mySize)
{
}

Or, create your own structure that holds the pointer to the array and it's size, ie:

typedef struct myType {
  int*   ptrToArray;
  size_t arraySize;
} myType_t;

int array[16] = { 0 };
myType_t data;
data.ptrToArray = array;
data.arraySize = 16;

void myFunction(myType_t data)
{
}
于 2013-04-08T16:24:41.333 に答える
0

関数にパラメーターとして渡す必要があります。または、固定として渡される配列のサイズを宣言する必要があります...

void myFunc( int* array, size_t numElements );

または、配列のサイズが既知の定数である場合

void myFunc( int array[10] );

または、配列のサイズを関数で使用できるようにするその他の無数の方法 (グローバルなど)。ポインターを介して配列のサイズを検出するのは、C の組み込み関数ではありません。

于 2013-04-08T16:02:02.470 に答える
0

予想に反して、次のプログラムはコードで終了します1(@K Scott Piel も)

int f(int a[10])
{
        return sizeof(a)/sizeof(int);
}

int main(void)
{
        int     a[10];
        return f(a);
}

これは実際、他の人が言及したとおりです。C のパラメーター配列は単なるポインターであるためです。コンパイラをチェックできます。バイパスするための拡張機能があるかもしれませんが、コードが移植できなくなります。

これを回避する方法は、配列を 内にラップすることstructです。次のプログラムは、コード 10 で終了します。

typedef struct { int a[10]; } a10;
int f(a10 a)
{
        return sizeof(a)/sizeof(int);
}

int main(void)
{
        a10     a;
        return f(a);
}

ただし、要素を取得するのは少し面倒です。さまざまなサイズの配列をサポートしたい場合は、自分でプログラムする必要があります(他の人が指摘したように)。sizeofはコンパイル時に計算され、コンパイラに関する限り定数であることに注意してください。プラットフォームごとにのみ異なります。

ああ、最初の例では参照渡しであるのに対し、2 番目の例の配列は値渡しであることに注意してください。

于 2013-04-08T17:19:48.960 に答える
0

配列を null で終了するか、要素の数を渡すことによって。C では、配列に含まれる要素の数を知る方法はありません。

于 2013-04-08T16:01:33.210 に答える