する#include <stdio.hに> する#include <STDLIB.H> malloc関数を解放// の#include <WINDOWS.H> SLEEP // ボイドMAIN1(){ // INT A [1024×1024×1000]; //配列のみデータ数が少ない処理 ; int型NUM = 100 、配列のサイズは明確でなければならない、NUM変数は、いつでも変更することができる; // INT Bは[NUM] 使用//このようなメモリ割り当て機構のアレイは、静的割り当てと呼ばれ、システムが完成されたアレイを自動回復 //動的メモリ割り当て / * mallocとfreeの二つの機能は、動的なメモリアプリケーションのC標準ライブラリで提供され、のmalloc()関数の呼び出し形式は実質的に、放出された: ボイド*のmalloc(unsigned int型のサイズ)。 サイズパラメータは、成功したユーザは、アプリケーションメモリのサイズを制御することにより、符号なし整数、であり、システムは、メモリサイズを開くプログラムのサイズバイトの領域であり、第1領域のアドレスを返し、 ユーザが利用することができます(例えば、十分なメモリサイズなど)のメモリブロックのアドレス管理及び使用、要求が失敗した場合は、ヌルポインタがNULLを返し。 malloc()関数は、void *型を返し、ポインタ割り当てのその他の種類によって返される値は、明示的な変換でなければなりません。 サイズがsizeバイトは、メモリブロック及びアプリケーションに格納されるデータの種類にかかわらず、適用する、したがって、アプリケーションの長さは、例えば「はsizeof(タイプ)×長さ」とは、メモリを介してプログラマによって与えられなければなりません。 (5 *はsizeof(INT)); * P = INT(INT *)malloc関数 などのフリーメモリが解放され、例えばフリー(P)は、 * / // p <+フィントサイクルので、Pサイクルを使用する必要があり、ここで留意すべきであるpFloat条件は、pFloat、それはpと書かれるべき定数です<p + FINT、そう<両側pが一緒に移動します //フォームで、数、およびフロートと初期化データを入力します。F 1.000,2.000 ... フロートF; scanfの( "%F"、&F); void *型= PVOIDのmalloc(F *はsizeof(フロート)); / / malloc関数はNULLポインタ値が返さ フロートpFloat * =(フロート*)PVOID; //標準的な方法 {ため(; IはFを<I ++はI = 0 INT) pFloatは[I] = I + 1; のprintf( " %F、%Pは\のN- "pFloat [I]、&pFloat [I]); } //指 のprintf(" \ N- \ N- \ N- "); フロート* P = pFloat; INTフィント=(INT)F ; のための(INT I = 0; P <pFloatフィントは+、++ I、Pは++){ } 無料(PVOID)。//解放PVOIDメモリアドレス、唯一の自由な、NULLポインタを解放することができる数回 } ボイドMAIN2(){ P = I + 1 *; のprintf( "%F、Pの%\ N-"、* P、P); フロートF = 3.0F; INT A =(INT)F; のprintf( "%のD、%F"、A 、A); //3,0.000000小さな整数で、%Fを解決するためによれば、0.0000000を印刷します } //////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// //// ボイドmain4(){ int型N-; scanfの( "%のD"、およびN-); // pDoubleダブル* =(*二重)のmalloc(N *はsizeof(ダブル)); // malloc関数を初期化しない *倍増pDouble =(ダブル*)のcalloc( )、N、はsizeof(ダブル); //のcallocのメモリを自動的に0に初期化される ため(I = 0.0ダブル; I <N - 、Iは++){ pDouble [(INT)I = I +は1.0; //私はintにキャスト のprintf( "%のLF、\ N- P%"を、pDouble [(INT)I]を、&pDouble [(INT)I]); } } ボイドmain5(){ int型NUM。 のprintf( "アレイの入力してくださいサイズ:\ N-"); scanfの( "%のD"、&NUM); INT * P =(INT *)はmalloc(NUM *はsizeof(INT)); IF(P == NULL )/ *エラー保護処理、メモリ割り当ての成功* /かどうかを確認し 、{ のprintf( "メモリ割り当てが失敗し、出口"); を返す; } (I = 0をint型のため、私はNUMを<; Iは++){ P [I] = I + 1; のprintf( "%のD、%Pは\のN-"、P [I]、&P [I]); } のprintf( "あなたは配列をrezizeしたい場合は、入力してください新新ナンバー:\ N-"); newNum INT; scanfの(「%のD」、&newNum); //メモリ空間を再割り当てするために割り当てられていると内容をコピー //関数は、(2つのパラメータのreallocを取る):割り当てられたメモリのアドレス、バイト数を再割り当て / / void *型のrealloc(ボイド* ptrに 、size_tのサイズ) int型* NEWP =(int型*)のrealloc((void *型)のp、newNum)。 //メモリのnewNumバイトを再分配、およびpのmallocの上に元のアドレスの内容をコピーするため のprintf( "のrealloc、Pの後: %D、%Pをする\ n"、* P、P); // P: 1,00030E58 のprintf( "reallocをした後、P + 5:%のD、P%は\ N-"、*(P + 5)、P + 5。。); // reallocの後、P +は5:13643,006D0E6Cは //のreallocですではないが自動的にNULLポインタを指しの種類ことを除いて、P、Pのアドレスも同様に、解放後 のため(= NUMをI int型、I <newNum; ++ I){// なお、第1 NUM要素はのreallocを有するため開始コピーnum個からなる、コピー NEWP [I]は= I + 1; } //配列は新しい割り当て印刷する {(; J <newNum J ++ INT J = 0)のため のprintf(「%のD、%をP \のN-」、NEWP [J]、&NEWP [J]); } 無料(P); //メモリの解放後、ポインタ(アドレス)の値は変化しませんが、キャンセルのタイプ 無料(NEWP); } / * 配列のサイズを入力してください: 。3 1,00020E58 2,00020E5C 3,00020E60 あなたは配列でrezizeしたい場合は、INPUT新しい新しい番号は、してください: 6 1,00020E58を使用すると、メモリ空間にパッチを適用するために、古いポインタpポイントの背中を学ぶことができ、新しく割り当てられたメモリ空間の最初のアドレスが同じである見ることができますそこに空いて残った空間があるので、次の課題に進み 、古いポインタpの後ろに空間が残っていない場合は2,00020E5C、メモリの別の領域、再割り当てを見つけるだろう、古い領域が自動的に解放され 3,00020E60 4,00020E64を 5,00020E68 6,00020E6C * / メインボイド(){ int型NUM; のprintf( "アレイの入力してくださいサイズ:\ N-"); scanfの( "%のD"、&NUM); INT * P =(INT *)のmalloc (NUM *はsizeof(int型)); IF(P - == NULL)/ *エラー保護、アプリケーションがメモリ* /成功したかどうかを確認するために 、{ のprintf( "メモリ割り当てが終了で失敗しました"); を返す; }他{ (int型のために私は0 =;私はNUMを<; Iは++){ Pは[I] = I + 1。 のprintf( "%のD、Pの%\ N-"、P [I]、およびP [I])。 } printf( "フリーの前に:P%\ N-"、p)は、 無料(P); //フリーの前にあり、pアドレスは変更されません後 のprintf( "フリー後:%のp \のN-"、P); P = NULLを。 //ソフトウェアエンジニアリング仕様は、NULLに設定するポインタのリリース後、参照を避けることができると発行のリリースのリリース後に再び繰り返される のprintf(「自由pの後[2 ]:%dは\ nを」、P [2]); //無料その後、再び引用P [2]、ゴミデータになり文句う } }