1

配列のサイズを知りたいときは、次のようにします。

int array[30];
for(int i = 0; i < 30; i++) 
     array[i] = i+1; //Fill list
const int size = sizeof(array) / sizeof(array[0]);

しかし、関数の引数として配列を渡すと、関数にポインターが含まれます。

int size( int array[] )
{
    return sizeof(array) / sizeof(array[0]); //Doesn't work anymore
}

これは明らかに機能しません。しかし、サイズに別のパラメーターを使用せずに、関数でその配列のサイズを取得するにはどうすればよいでしょうか?

4

5 に答える 5

5

サイズに別のパラメーターを使用せずに、関数でその配列のサイズを取得するにはどうすればよいですか?

あなたはそうしない。配列のサイズは、コンパイラから見える場所にある必要があります。それ以外の場合、渡すことができるのは、配列の最初の要素へのポインターだけです。

ただし、サイズに a を使用しtemplateて、これをもう少し魔法的でシームレスにすることができます。

template <size_t N>  int size (const int (&ary)[N])
{
    assert (N == (sizeof(ary) / sizeof (ary[0])));
    return N;
}

さらに、要素の型をテンプレート化するため、これはあらゆる配列で機能します。

template <typename T, size_t N>  int size (const T (&ary)[N])
{
    assert (N == (sizeof(ary) / sizeof (ary[0])));
    return N;
}
于 2013-10-23T15:47:19.937 に答える
1

C では、関数パラメーター内の配列は非常に奇妙な動作をします。率直に言って、ここでの言語の設計は非常にまずかったと思います。

void foo(int data[10]) {
    int *p;
    int a[10];
}

sizeof(p)おそらく 4 (あるいは 8) になるでしょう。そしてsizeof(a)40(または80)になります。

では、どうなると思いsizeof(data)ますか?40 (または 80) だと思ったら大間違いです。代わりに、そのサイズは と同じsizeof(p)です。

C コンパイラ[がパラメータ名の直後に a を見た場合、それを削除してポインタに置き換え、 にdata[10]なり*dataます。(これは、他の場所の配列で得られる減衰動作とは異なります。パラメーターの場合、配列はより大幅に処理されます)。

実際、配列のサイズが異なっていても、以下はコンパイルされます。

int foo(int data[10]);
int main() {
    int hugearray[1000];
    foo(hugearray); // this compiles!
}

C コンパイラは、配列パラメーターのサイズを考慮しません。*コンパイラは配列パラメータに対して警告を発し、直接使用することを奨励すべきだと私は信じています。を許可するかもしれませんが、コンパイラによって無視されることを考えると[]、確かにそうではありません。[10]

C コンパイラで配列のサイズを考慮したい場合は、配列のアドレスを渡す必要があります。

int foo(int (*data)[10]);
int main() {
    int smallarray[10];
    foo(&smallarray); // OK
    int hugearray[1000];
    foo(&hugearray); // error, as desired
}

元の質問に戻ると、パラメーター配列はそのサイズについて何も知りません。

于 2013-10-23T16:06:28.940 に答える
0

マクロを使用

int findSize(int array[])
{
//This will not return size off array,it will just get starting address array and no information about boundaries

    return sizeof(array) / sizeof(array[0]);

}
//But we can define a Macro for this

#define FIND_ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))

int main()
{

    int SampleArray[30];

    printf("\nSize =%d ",sizeof(SampleArray) / sizeof(SampleArray[0]));
    printf("\nSize from Function =%d ",findSize(SampleArray));
    printf("\nSize from Macro =%d ",FIND_ARRAY_SIZE(SampleArray));
    printf("\n");

    return 0;

}
于 2013-10-23T16:14:28.680 に答える