宣言は次のようになります。
void *malloc(size_t size);
void free(void *pointer)
私が理解できる限り、void * mallocは、mallocがvoidへのポインター(「Voidポインター」)を返し、freeが単にvoidであることを意味します。違いは何ですか?なぜこのように見えるのですか?
void
just は、戻り値の型が定義されていない (たとえば、へのポインターではない) ことを意味し、指定char
されたサイズのメモリの連続したブロックです。
free()
何も返しません。その必要はありません。
malloc
void*
割り当てられたメモリへのポインタ()を返します。free
メモリを解放します。何も返しません(void
)。
それらは互いに同等ではありません。なぜ比較するのですか?
mallocはメモリを割り当てるため、割り当てられたメモリへのポインタを返す必要があります。
freeはメモリの割り当てを解除し、値を返す必要がないため、無効です。
void pointer
ジェネリックポインタです。これは、任意のタイプのポインターに割り当てることができます。そのため、mallocはそのように設計されています。
free() は何も返しません。ヒープから指定されたアドレス エントリを持つメモリ ブロックの割り当てを解除するだけです。
Cの問題は、この場合、弱い型付けであるということです。int、chars、double、またはその他の構造体の配列をmallocすることはできません。可能なすべてのタイプ(独自の構造体を含む)にはmalloc/freeペアが必要です。したがって、ある型へのポインタを返す代わりに、ポインタはvoid型になります。つまり、データの型は未定であり、通常はそのポインタを必要な型ポインタにキャストします。
したがって、mallocの一般的な使用パターンは次のとおりです。
type *myMemory = (type *)malloc(x * sizeof(type));
ここで、typeはmallocするタイプ(int、char、struct ...)であり、xはmallocする「インスタンス」の数です。
freeメソッドは、mallocからポインターを取得して解放します。同じロジックに従って、int、char ...ポインターを取ることができないため、voidポインターを取ります。ボイドポインタは、他のポインタと「互換性があります」。
malloc()
は、主なジョブがreturn pointer to starting address of the memory block
malloc()によって割り当てられるメモリ割り当て関数です。問題はmalloc()
、どのsingle
タイプに対しても汎用的ではないように設計されているため、address return should not be for a specific type
(char、intなど)は汎用的である必要があるためmalloc()
、voidポインタを返します。プログラマーに、それを任意の型にキャストしてそのメモリーを使用するオプションを提供しています。したがって、その戻りタイプはvoid*です。
のためfree()
に、それは主な仕事がするメモリ解放関数ですfree the content of the memory address pointed by the argument
。これはまた、char、intなどだけでなく任意のメモリタイプを解放できるジェネリック用に設計されているため、引数タイプはvoid*です。
何も返さないということは、それがポインタやその他のものではなく無効であることを意味するので、単に無効になります。
それらは完全に異なるものです。それらが似ているという事実は、使用されている構文にかかっています。
「void *」は、特定の型が関連付けられていないメモリ ブロックへのポインタです。他の任意のポインター型にキャストできます。
"void" (星印なし) は、関数が値をまったく返さないことを意味します。
void*
「任意の型ポインタ」を意味します。その特定の瞬間にタイプが定義されていないか重要ではないメモリを指します。
void
何もありません。値なし。
printf("malloc returned address %p\n", malloc(1));
有効な C であり、malloc
未定義のデータを含むメモリ ブロックへのポインタを返します。
printf("free returned status %d\n",free(ptr));
free
実際には何も返さないため、有効な C ではありません。