3
int first[] = {1, 4};
int second[] = {2, 3, 7};

arrayOfCPointers[0] = first;
arrayOfCPointers[1] = second;

NSLog(@"size of %lu", sizeof(arrayOfCPointers[0]) / sizeof(int));

サブ配列の配列が必要です。各サブ配列は異なるサイズである必要があります。しかし、各サブ配列のサイズを知る必要がありますか?

ログは 1 を返し続けます

4

4 に答える 4

4

サイズをどこかに保存する必要があります。言語は、裸の C 配列に対してはそうしません。あなたが持っているのは、最初の要素のアドレスだけです。

于 2012-07-06T13:05:17.927 に答える
2

配列とそのメタデータ (長さなど) を保持するラッパー クラスまたは構造体を記述します。

typedef struct tag_arrayholder
{
    int* pArray;
    int  iLen;
}ArrayHolder;


    int first[] = {1, 4};

    ArrayHolder holderFirst;
    holderFirst.pArray = first;
    holderFirst.iArrayLen = sizeof(first) / sizeof(int);

    arrayOfCPointers[0] = holderFirst;

    NSLog(@"size of %lu", arrayOfCPointers[0].iLen);

または、trojanfoe が言ったように、最後の位置をマークする特別な値を保存します (ゼロで終わる文字列が使用するアプローチとまったく同じです)。

于 2012-07-06T15:02:38.660 に答える
0

「sizeof」命令を使用して、配列で使用されるバイト数を知ることができますが、静的配列でのみ機能し、ダイナミクスではポインターサイズを返します。したがって、静的配列では、次の式を使用できます: sizeof(tab)/sizeof(tab[0]) 最初の部分はタブのサイズをバイト単位で示し、2番目の部分は要素のサイズを示すため、配列のサイズを知ることができます。結果は、配列内の要素の量です! しかし、動的配列を使用する唯一の方法は、サイズをどこかに保存するか、配列の最後に「センティナル値」を配置して、要素をカウントするループを記述することです!

(私の英語でごめんなさい、私はフランス語です:/)

于 2012-07-06T13:34:51.287 に答える
0

使用している式が配列の最初の要素のサイズ ( のサイズ)を のサイズで除算しているため、NSLogステートメントは値を出力しています。1intint

したがって、現在持っているものは次のとおりです。

NSLog(@"size of %lu", sizeof(arrayOfCPointers[0]) / sizeof(int));

配列ブラケットを削除すると、探している値が得られます。

NSLog(@"size of %lu", sizeof(arrayOfCPointers) / sizeof(int));

他の回答が指摘しているように、配列を別のメソッドまたは関数に渡すと、これは機能しません。その場合に渡されるのはアドレスだけだからです。上記が機能する唯一の理由は、配列の定義がローカルスコープにあるためです。したがって、コンパイラは型情報を使用してサイズを計算できます。

于 2012-07-06T14:58:40.627 に答える