C言語の動的割当てメモリ

2479 ワード

なぜ関数を使用してメモリの動的割り当てを実現するのでしょうか.システムはメモリを自動的に割り当てるのではないでしょうか.
このような質問をする人がいる以上、ここでよく説明しましょう.まず、コンピュータのメモリを熟知しましょう.
コンピュータのシステムには4つのメモリ領域があります.
1)スタック:スタックに定義した局所変数とパラメータ(形式パラメータ)を格納します.
2)文字定数領域:主にいくつかの文字定数を保存する.例えば:char*p_str=”cgat”;ここで「cgat」は文字定数領域に格納される.
3)グローバル領域:グローバル領域にいくつかのグローバル変数と静的変数を格納する.
4)スタック:スタックは主に動的に割り当てられたストレージ空間、すなわち、次に述べる動的に割り当てられたメモリ空間である.
メモリ領域を動的に割り当てる必要があるのはいつですか?例をあげましょう.int *p; intタイプを指すポインタpを定義した.pは1つのアドレスの値を格納するために使用されます.私たちがpという変数に空間を割り当てるのは、明確な指向を持って、例えばをしましょう.あなたは今方向を指す道しるべを作ったが、あなたはこの道しるべに正確な方位を指さなかった.つまり、今の道しるべは盲目的に指し示している.そうすれば、私たちはそれを通じてどこが東で、どこが西で、何が北で、何が南なのかを明確にすることはできない.コンピュータのメモリにポインタ変数を定義しましたが、この変数に正確なintタイプの変数のアドレスを指示させなかったので、明確な指示方向を持たなければなりません.これにより、メモリを動的に割り当てることで、その方向を規定することができます.
ポインタに触れたばかりの頃、int*pという状況に遭遇しました.p=&a;この方法はポインタの動的割り当てメモリではありません.これをポインタ変数の初期化と言います.初期化は、ポインタ変数に方向性を持たせることもできます.int *p;p=malloc(n*sizeof(タイプ名));私たちはmalloc()関数を通じてポインタ変数pにアドレスを割り当て、キーボードから入力した値をpに格納します.次に、scanf("%s",p)など、このpを具体的に操作することができます.
pの操作が終了すると、pのメモリ領域も解放されます.なぜメモリ容量を解放するのですか?動的に割り当てられた変数はスタックに格納されていますが、このスタックの空間は無限大ではありません.小さなプログラムを作成したとき、私たちは何も発見できないかもしれませんが、大きなプログラムについては、スタックの空間をタイムリーに解放するよりもメモリが漏れる可能性があります.メモリ漏洩とは、スタックの空間が北にあるため、動的に割り当てられていません.このように、動的に割り当てられたスタックの空間を使用すると、元の空間を占有する必要があります.つまり、入力した値を他の空間に格納し、元のデータが破壊されます.メモリの漏洩を招いた.
また、malloc()関数を使用する場合は、スペースを解放したときに元のポインタ変数をNULL、すなわち空のポインタを与え、次のときに使用することに注意してください.もし私たちが|NULLを与えなければいいですか?答えは:だめだ!空のポインタを与えないと、元のポインタ変数が野のポインタになります.野指針とは何ですか.野ポインタは明確に指向されていないポインタであり、システムはどこを指向するか分からないので、野ポインタは危険です.そのため、malloc()関数を使用するたびに空のポインタを与えなければなりません.malloc()関数に対してcalloc()関数はNULLを付与する必要はありません.これは、calloc()関数が呼び出されるたびに、システムが元のポインタに空のポインタを自動的に付与し、すなわち「0」に帰するためです.calloc()関数のプロトタイプはvoid*calloc(count,sizeof(タイプ名));例えば、p=(char*)calloc(4,sizeof(char);pにchar型ポインタを指す「4」個の空間を割り当てた.
malloc()とcalloc()のほかに、void*realloc(void*p,size_t size);この関数にはいくつかの役割がある:1)pのメモリブロックを拡張するのに十分な空間がある場合、pを指すポインタを返す.2)pのメモリブロックを拡張するのに十分な空間がない場合、pにsizeの空間を新たに割り当て、元の内容をpにコピーし、pの先頭を指し、元の空間を解放し、新しいメモリブロックを指すポインタを返す.3)p=NULLの場合、malloc()に似ている.次に、プログラムの例を示します.
#define LONG 10
#include
#include
#include
main()
{
   char *message,buf[LONG];
   gets(buf);
   message=(char*)realloc(NULL,strlen(buf)+1);
   strcpy(message,buf);
   puts(message);
   gets(buf);
   message=(char*)realloc(message,(strlen(message)+strlen(buf)+1));
   strcat(message,buf);
   puts(message);
   return 0;
}