1

Cのmalloc関数は、割り当てたいメモリの「チャンク」の数をパラメータとして取り、mallocによって返された値をキャストするものに基づいてチャンクのバイト数を決定することを本で読んでいます。たとえば、私のシステムでは、int は 4 バイトです。

int *pointer;

pointer = (int *)malloc(10);

コンパイラは int が 4 バイトであることを認識しているため、40 バイトを割り当てます。

これは2つの理由で私を混乱させます:

  1. 私は読んでいましたが、サイズパラメーターは実際には割り当てたいバイト数であり、どのタイプのサイズとも関係ありません。

  2. Malloc は、アドレスを返す関数です。void から別の型に返されたアドレスの外部キャストに基づいて、割り当てられたメモリのサイズをどのように調整しますか? それは私が受け入れるはずのコンパイラの魔法ですか?

本が間違っているような気がします。どんな助けや説明も大歓迎です!

その本には次のように書かれていました。

char *string;
string = (char *)malloc(80);

80 は、80 チャンクのストレージを確保します。チャンク サイズは型キャスト (char *) によって設定されます。これは、malloc() が 80 文字のテキスト用のストレージを見つけることを意味します。

4

2 に答える 2

8

はい、その本は間違っていますが、あなたは正しいです、その本を捨ててください。
また、本の名前をみんなに知らせて、決してお勧めしないブラックリストに永久に載せることができるようにしてください.

よく読んでください:
malloc のベスト プラクティスは何ですか?

于 2013-04-06T04:17:16.730 に答える
7

を使用malloc()する場合は、sizeof 演算子を使用し、割り当てられるオブジェクトの型ではなく、そのオブジェクトに適用します。

良い考えではありません:

int *pointer = malloc (10 * sizeof (int)); /* Wrong way */ 

より良い方法:

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

根拠: ポインターが指すデータ型を変更する場合、malloc() 呼び出しも変更する必要はありません。メンテナンス勝利。

また、この方法では、コード開発中にエラーが発生しにくくなります。変数宣言とは別に malloc() 呼び出しが発生する場合は、宣言を見なくても正しいことを確認できます。

malloc() のキャストに関する質問については、今日の C では malloc() のキャストは必要ないことに注意してください。また、将来のリビジョンでデータ型が変更された場合、そこにあるキャストも変更するか、別のエラー ソースにする必要があります。また、常に<stdlib.h>含まれていることを確認してください。多くの場合、インクルード ファイルがないことによる警告を取り除くために、キャストを入れます。もう 1 つの理由は、C++ では必須ですが、通常は malloc() を使用する C++ コードを作成しないことです。

malloc() が内部でどのように機能するかについての正確な詳細は、仕様では定義されていません。実際には、明確に定義されたインターフェイスを備えたブラック ボックスです。実装でどのように機能するかを確認するには、例としてオープン ソースの実装を参照してください。しかし、malloc() はさまざまなプラットフォームで大幅に異なる可能性があります (実際にそうです)。

于 2013-04-06T04:28:06.197 に答える