0
#include<stdio.h>
int main(){
    int * ptr=(int *)malloc(40);
    printf("%d",sizeof(ptr));
}

これを実行しているとき、出力は8として表示されます...ここで何が起こっているのですか...なぜ出力8なのですか?

4

5 に答える 5

2

sizeof演算子はコンパイル時の演算子であり、ポインターのサイズはマシン上で 8 バイトです。

malloc-ed メモリ ゾーンの動的サイズを取得する方法はありません。それ以外の場合は、それを知っているか、どこかに保管する必要があります。

Boehm の保守的なガベージ コレクターを使用することを検討してから、GC_malloc代わりにを呼び出します。(または)mallocを呼び出す必要はありません。また、 (または )から始まる以前のメモリ ゾーンのおおよそのサイズを取得するために使用できますを使用することをお勧めします)。freeGC_freeGC_size(p)GC_mallocpGC_size

mallocLinux で使用する場合は、 valgrindを使用してメモリ リークのバグを追跡する方法を学び、次のようにコンパイルします。gcc -Wall -g

于 2013-02-26T07:03:34.337 に答える
2

malloc()40 バイトのメモリ (おそらく 10 int) へのポインタを返し、それを に割り当てますptr。理由sizeof(ptr)は 8 です。これは、64 ビット マシンを使用していて、ポインターのサイズが 8 バイトであるためです。

これは適切な形式であり、型のサイズが変更された場合 (クロスプラットフォームなど) に問題を回避できるため、 のsizeof()内部で使用する必要があります。malloc()本当に 10 int のスペースが必要な場合は、次を使用します。

int *ptr = malloc(10 * sizeof *ptr);

ptrこれにより、型ポイントのサイズの 10 ロットが割り当てられます。この場合はint. これを行う利点は、型を変更せずに型を変更できることです。malloc()

于 2013-02-26T07:04:48.297 に答える
0

変数ptrは int へのポインターであり、システムのサイズはたまたま 8 バイトです。

于 2013-02-26T07:03:56.357 に答える
0

ptr はポインターです。システム上のポインターのサイズを出力します。ptr はアドレスを保持するため、64 ビット マシンでアドレスを保持するために必要なサイズは 8 バイトです。これはコンパイラ固有です。ポインタに割り当てられたサイズを取得することはできません。

この疑いがある場合は、ポインタに割り当てられたサイズを知らずに free() がメモリを解放する方法についても疑問を抱く必要があります。

于 2013-02-26T07:04:30.117 に答える
0

私は Windows 32 ビット マシンでこれを試しました。4 バイトの ans を取得しています。

于 2013-02-26T07:46:26.203 に答える