#include<stdio.h>
int main(){
int * ptr=(int *)malloc(40);
printf("%d",sizeof(ptr));
}
これを実行しているとき、出力は8として表示されます...ここで何が起こっているのですか...なぜ出力8なのですか?
sizeof
演算子はコンパイル時の演算子であり、ポインターのサイズはマシン上で 8 バイトです。
malloc
-ed メモリ ゾーンの動的サイズを取得する方法はありません。それ以外の場合は、それを知っているか、どこかに保管する必要があります。
Boehm の保守的なガベージ コレクターを使用することを検討してから、GC_malloc
代わりにを呼び出します。(または)malloc
を呼び出す必要はありません。また、 (または )から始まる以前のメモリ ゾーンのおおよそのサイズを取得するために使用できますを使用することをお勧めします)。free
GC_free
GC_size(p)
GC_malloc
p
GC_size
malloc
Linux で使用する場合は、 valgrindを使用してメモリ リークのバグを追跡する方法を学び、次のようにコンパイルします。gcc -Wall -g
malloc()
40 バイトのメモリ (おそらく 10 int) へのポインタを返し、それを に割り当てますptr
。理由sizeof(ptr)
は 8 です。これは、64 ビット マシンを使用していて、ポインターのサイズが 8 バイトであるためです。
これは適切な形式であり、型のサイズが変更された場合 (クロスプラットフォームなど) に問題を回避できるため、 のsizeof()
内部で使用する必要があります。malloc()
本当に 10 int のスペースが必要な場合は、次を使用します。
int *ptr = malloc(10 * sizeof *ptr);
ptr
これにより、型ポイントのサイズの 10 ロットが割り当てられます。この場合はint
. これを行う利点は、型を変更せずに型を変更できることです。malloc()
変数ptr
は int へのポインターであり、システムのサイズはたまたま 8 バイトです。
ptr はポインターです。システム上のポインターのサイズを出力します。ptr はアドレスを保持するため、64 ビット マシンでアドレスを保持するために必要なサイズは 8 バイトです。これはコンパイラ固有です。ポインタに割り当てられたサイズを取得することはできません。
この疑いがある場合は、ポインタに割り当てられたサイズを知らずに free() がメモリを解放する方法についても疑問を抱く必要があります。
私は Windows 32 ビット マシンでこれを試しました。4 バイトの ans を取得しています。