可能性のある複製:
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()
を使用するときは知りません。
2番目の場合、num
は配列ではなく、ポインターです。 sizeof
は、プラットフォーム上で8バイトのように見えるポインタのサイズを提供します。
動的に割り当てられた配列のサイズを知る方法はありません。別の場所に保存する必要があります。 sizeof
は型を調べますが、malloc
の結果から完全な配列型(_int[5]
_などの指定サイズの配列型)を取得することはできません。およびsizeof
引数は、_int[]
_などの不完全な型に適用できません。
配列はポインターではありません(ここではなく、状況によってはポインターになります)。
最初のものは配列です-sizeof
は配列のサイズ= 40バイトを与えます。
2番目はポインタです(ポイントする要素の数に関係なく)-sizeof
はsizeof(int*)
を提供します。
2番目のサイズは、ポインターのサイズを指します。これは、マシンでは(おそらく64ビット)、8バイトです。
sizeof()
を使用して動的に割り当てられた構造のサイズを回復することはできませんが、静的に割り当てられた構造に対してはできます。
割り当てたもののサイズを知りたい場合は、コードが割り当てを行ったため、自分でそのことを「記憶」する必要があります。コードが割り当てを行っていない場合は、[標準的な意味で]ポインターが指しているメモリの大きさを確認する方法はありません。他の方法で「知る」必要があります。