0

重複の可能性:
動的に割り当てられた 2 次元配列のサイズを取得する方法

ここで何が間違っていたのかわかりません。サイズがユーザー入力に基づく配列を作成し、ユーザー入力から配列のデータ (整数) を取得し、配列整数を出力したいと考えています。

問題は、最初の配列要素、つまりintArr[0].

int main()
{
    int i, n, *intArr;

    printf("Type the array size:\t");
    scanf("%d", &n);

    intArr = (int *)malloc(n * sizeof(int));

    for (i = 0; i < n; ++i)
    {
        printf("Type a number\t");
        scanf("%d", intArr + i);
    }

    printArr(intArr);
}

void printArr(int *arr)
{
    int i; 
    for (i = 0; i < (sizeof(arr) / sizeof(*arr)); ++i)
        printf("%d ", *(arr + i));
}
4

3 に答える 3

3

の型は でarrあり、の要素数ではありませint*ん。お使いのシステムと同じで、結果として 1 を与えるため、ループは 1 つの要素のみを出力します。sizeof(arr)sizeof(int*)arrsizeof(int*)sizeof(int)

printArr()要素数を引数として関数に渡します。

ノート:

  • free()あなたが持っているものmalloc()d.
  • の戻り値のキャストmalloc()は不要です。
  • の戻り値をチェックscanf()して、成功したことを確認してください。
于 2012-10-04T07:54:44.563 に答える
1

配列をポインターとして関数に渡すことはできません。配列が最初の要素へのポインターに崩壊すると、サイズに関する情報が失われます。

サイズを追加の明示的な引数として渡します。

于 2012-10-04T07:55:12.440 に答える
0

引数の数を printArr() 関数に渡していません。これを知る方法はありません。要素の数を別のパラメーターとして渡します。

「arr」の型は整数へのポインタです。コンピュータのアーキテクチャにもよりますが、おそらく 4 バイトです。"*arr" と同じサイズ。

あなたは試すことができます:

printf("%d \n", (int) sizeof(arr));
printf("%d \n", (int) sizeof(*arr));
printf("%d \n", (int) sizeof(arr) / sizeof(*arr));

次のような出力が表示されます。

4
4
1

したがって、印刷ループを 1 回だけ実行する運命にあります。

于 2012-10-04T08:03:20.073 に答える