C言語での動的メモリ割り当てのためのmalloc関数

WBOY
リリース: 2024-01-17 09:09:06
転載
857 人が閲覧しました

C言語での動的メモリ割り当てのためのmalloc関数

C言語のmalloc関数

ヘッダー ファイルをインクルードする必要があります:

####含む### ###または### ####含む###

関数宣言(関数プロトタイプ):

void *malloc(int size);

malloc 関数は、指定されたサイズのメモリ空間をシステムに割り当てるために使用され、戻り値の型は void* です。 C および C++ では、 void* 型のポインターを他の型のポインターにキャストできます。

関数宣言から、malloc と new には少なくとも 2 つの違いがあることがわかります。new は指定された型のポインターを返し、必要なサイズを自動的に計算できます。例えば:###

int *p;

p = new int; //戻り値の型は int* 型 (整数ポインタ)、割り当てサイズは sizeof(int);

###または:###

int* パー;

parr = new int [100]; //戻り値の型は int* 型 (整数ポインタ)、割り当てサイズは sizeof(int) * 100;

そして、malloc は必要なバイト数を計算し、返された後に実際の型のポインターへの変換を強制する必要があります。

int* p;

p = (int *) malloc (sizeof(int));

まず、malloc 関数は void * 型を返します。p = malloc (sizeof(int)); と書くと、プログラムはコンパイルできず、「void* を int に割り当てることはできません」というエラーが報告されます。 * 型変数。」したがって、キャストするには (int *) を渡す必要があります。

2 番目に、関数の実際のパラメータは sizeof(int) で、これは整数データの必要なサイズを指定するために使用されます。次のように書くと:

int* p = (int *) malloc (1);

コードはコンパイルすることもできますが、実際に割り当てられるメモリ空間は 1 バイトだけです。整数を格納すると、3 バイトがホームレスとなり、直接「隣人の家に住む」ことになります。その結果、後続のメモリ内の元のデータ内容はすべてクリアされます。

malloc は new [] の効果を実現し、必要なメモリ サイズを指定するだけで連続メモリを適用することもできます。

たとえば、int 型スペースを 100 個割り当てたい場合:

int* p = (int *) malloc ( sizeof(int) * 100 ); //100 個の整数を保持できるメモリ領域を割り当てます。

直接目に見えないもう 1 つの違いは、malloc はメモリを割り当てるだけで、取得したメモリを初期化できないため、取得した新しいメモリの値はランダムになることです。

割り当て方法と最終解放方法が異なることを除いて、ポインタは malloc または new を通じて取得され、その他の操作は一貫しています。

C 言語の malloc 関数の問題は、次の関数で malloc を 2 回使用して、p に合計 6 ユニットのメモリを与えていることです。

###すべて展開###

メモリを 2 回割り当てました。1 回目は 3 int でした。残念ながら、それを失いました。2 回目に 3 int を割り当てたときも、このポインタはまだ使用されていました。新しいメモリの最初の 3 つの int に値を割り当てていませんでした。 3 つの int ユニットが境界外にあったため、プログラムがすぐにクラッシュしなかったのは偶然でした

int *p, *p1,i;

p = (int *)malloc(3*sizeof(int));

for(i=0;i printf("\n int put:");

scanf("%d",p i);

}

p1 = (int *)malloc(3*sizeof(int));

for(i=0; i printf("\n int put:");

scanf("%d",p1 i);

}

for(i=0;i for(i=0;i 非常に単純な malloc 関数の問題

malloc 関数のプロトタイプを見てみましょう

void* malloc(int)

malloc のパラメータは、適用されるメモリの量をバイト単位で示す整数で、戻り値はそのメモリへのポインタ (null 型ポインタ) です。

sizeof は演算子で、型または変数によって占有されているメモリ内のバイト数を取得でき、結果は整数になります。したがって、 pp=(float *)malloc(sizeof(float)); 実際に最初に sizeof(float) を計算して、メモリ内で float 型が占めるバイト数を取得します。32 ビット環境では、これは 4 バイトである必要があります。結果は 4 です。次に、malloc(4) は 4 バイトのメモリ空間に適用され、このメモリ領域のアドレスを返し、それを強制的に float* 型に変換します。

リンク リストについては、各リンク リスト要素には次または前の要素のアドレスが格納されます。当然のことながら、各リンク リスト要素はメモリ領域を占有します。リンク リストに新しい要素を追加する場合は、最初にアドレスを割り当てる必要があります。そうでない場合、データを保存する場所がありません。

以上がC言語での動的メモリ割り当てのためのmalloc関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:docexcel.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!