web-dev-qa-db-ja.com

C、Malloc()および配列の長さ

可能性のある複製:
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()を使用するときは知りません。

15
GCBenson

2番目の場合、numは配列ではなく、ポインターです。 sizeofは、プラットフォーム上で8バイトのように見えるポインタのサイズを提供します。

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

25
effeffe

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

最初のものは配列です-sizeofは配列のサイズ= 40バイトを与えます。

2番目はポインタです(ポイントする要素の数に関係なく)-sizeofsizeof(int*)を提供します。

5
Luchian Grigore

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

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

2
Rubens

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

1
Mats Petersson