3

ポインタがC配列でどのように機能するのかよくわかりません。これが私が得たいくつかのコードです:

int arrayOne[] = {1, 2, 3};
int arrayTwo[] = {4, 5, 6, 7};

int **arrayThree = (int **)malloc(2 * sizeof(int));
arrayThree[0] = arrayOne;
arrayThree[1] = arrayTwo;

for (int i = 0; i < 2; i++) {
    int *array = arrayThree[i];
    int length = sizeof(array) / sizeof(int);
    for (int j = 0; j < length; j++)
        printf("arrayThree[%d][%d] = %d\n", i, j, array[j]);
}

私はこれが次のように出力することを期待していました:

arrayThree[0][0] = 1
arrayThree[0][1] = 2
arrayThree[0][2] = 3
arrayThree[1][0] = 4
arrayThree[1][1] = 5
arrayThree[1][2] = 6
arrayThree[1][3] = 7

実際に出力されるのは次のとおりです。

arrayThree[0][0] = 1
arrayThree[0][1] = 2
arrayThree[1][0] = 4
arrayThree[1][1] = 5

なぜ?!

4

4 に答える 4

11

sizeof(array)はポインタのサイズです。これはたまたまintプラットフォーム上のの2倍のサイズです。

Cで配列の長さを取得する方法はありません。自分で覚えておく必要があります。

于 2011-03-07T14:54:40.227 に答える
4

まず第一に、int **arrayThree = (int **)malloc(2 * sizeof(int))間違っている、それはあるべきですsizeof(int *)

次に、あなたが望むものではないことにsizeof(array) / sizeof(int)対応します。sizeof(int *) / sizeof(int)

配列として扱うポインタには「埋め込まれた」サイズ情報はありません。サイズを手動で管理する必要があります。

于 2011-03-07T14:54:54.160 に答える
1

Cには配列のサイズを追跡するための組み込みのメカニズムはありません。自分で配列を維持し、配列をパラメーターとして受け取る関数に渡す必要があります。

ただし、Cで配列を広範囲に動的に使用する必要がある場合は、あまり労力をかけずに、Cで動的配列の独自のライブラリを構築できます。詳細については、次のチュートリアルを参照してください:goo.gl/vYhkF。

于 2011-03-07T15:09:24.537 に答える
0

まず第一に、の割り当てarrayThree

int **arrayThree = malloc(2 * sizeof *arrayThree);

のタイプarrayThreeint **、であるため、のタイプは*arrayThreeですint *

sizeof (array) / sizeof (int)期待どおりに返されない理由は、配列型ではなくポインタ(型)であるためarrayポイントされた要素の数ではなく、ポインタオブジェクト自体に含まれるバイト数を返します。 int *sizeof

ポインタ値だけから、ポイントされている要素の数を知る方法はありません。その情報を個別に追跡する必要があります。

于 2011-03-07T15:40:02.703 に答える