23

重複
の可能性:sizeof(配列を指すポインター)を見つける方法

Cで動的配列を作成する方法を学んでいますが、理解できない問題に遭遇しました。

コードを使用する場合:

int num[10];
for (int i = 0; i < 10; i++) {
    num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));

出力を取得します:

sizeof num = 40
sizeof num[0] = 4

これは私が起こることを期待していることです。ただし、配列のサイズを次のようにmallocすると、次のようになります。

int *num;
num = malloc(10 * sizeof(int));
for (int i = 0; i < 10; i++) {
    num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));

次に、出力を取得します。

sizeof num = 8
sizeof num[0] = 4

固定長メソッドを使用した場合に配列のサイズが40である理由を知りたいのですが、を使用した場合はそうではありませんmalloc()

4

4 に答える 4

32

2番目のケースでnumは、は配列ではなく、はポインタです。sizeofポインタのサイズを示しています。これは、プラットフォームでは8バイトのようです。

動的に割り当てられた配列のサイズを知る方法はありません。別の場所に保存する必要があります。型を調べますが、の結果からsizeof完全な配列型(typeのように指定されたサイズの配列型)を取得することはできません。また、のような不完全な型に引数を適用することはできません。int[5]mallocsizeofint[]

于 2012-12-22T16:57:58.297 に答える
5

配列はポインターではありません(ここではなく、状況によってはポインターへの減衰)。

最初のものは配列sizeofです-したがって、配列のサイズ=40バイトになります。

2番目はポインタです(それが指す要素の数に関係なく)-sizeofを与えますsizeof(int*)

于 2012-12-22T16:58:22.410 に答える
2

2番目のサイズはポインタのサイズを指します。マシンでは(おそらく64ビット)、8バイトです。

sizeof()動的に割り当てられた構造のサイズを回復するために使用することはできませんが、静的に割り当てられた構造に対しては回復できます。

于 2012-12-22T16:58:20.597 に答える
2

割り当てたもののサイズを知りたい場合は、コードが割り当てを行ったので、自分でそれを「覚えておく」必要があります。コードが割り当てを行っていない場合、[標準的な意味で]ポインタが指しているメモリの大きさを知る方法はありません。他の方法で「知る」必要があります。

于 2012-12-22T17:02:12.577 に答える