コンピュータ アプリケーション プログラムは、メモリ内でコードを格納するコード セグメントと書籍データを格納するデータ セグメントの 2 つの部分に分割できます。
コード セグメントにはユーザーが記述したコードが格納され、データ セグメントはヒープとスタックに分割できます。
Linux システムでは、データ セグメントには、プログラム内で明示的に初期化されるグローバル変数、静的変数 (グローバルおよびローカル静的変数を含む)、および定数 (文字列など) を含む、グローバルに初期化されたデータ セグメント/データ セグメントが追加されています。
スタック: 英語名は - stack で、関数のパラメータやローカル変数などを格納するためにコンパイラによって確保および解放される領域です。関数を呼び出してスタックを使用する方法により、異なる関数内で定義された同じ名前の変数が混同されなくなります。スタックの管理方式はFILO(First In Last Out)であり、「先入れ後出し」と呼ばれます。
ヒープ: 英語名 - ヒープ。通常は bss セグメントとスタックの間に位置し、メモリを動的に割り当てるために使用されます。この領域はプログラマによって管理され、プログラマはオペレーティングシステムが提供する割り当て・解放機能を利用してヒープ領域のメモリを使用します。
メモリ管理関数: malloc() および free() 関数
C プログラムには、次の 2 つの主要なメモリ管理機能があります。
malloc() 関数はメモリの割り当てを担当し、free() 関数は malloc() によって割り当てられたメモリを解放します。malloc() 関数は、割り当てられたメモリの最初のアドレスを返します。
//test.c
int g_var_a=0; //存放在全局已初始化数据区
char g_var_b; //存放在BSS区(未初始化全局变量)
int main()
{
int var_a; //存放在栈区
char var_str[]="string1"; //存放在栈区
char *p_str1,*p_str2; //存放在栈区
char *p_str3="string2"; //存放在已初始化数据区,prt_str3存放在栈区
static int var_b=100; //全局静态数据,存放在已初始化区
p_str1=(char*)malloc(1024); //从堆区分配1024B内存
p_str2=(char*)malloc(2048); //从堆区分配1024B内存
free(p_str1);
free(p_str2);
return(0);
実用的なメモリ割り当て関数- calloc() と reloc()
calloc() 関数は新しいメモリを割り当てるために使用され、relloc() 関数はすでに割り当てられているメモリのサイズを変更するために使用されます。
注: malloc() と reloc() の違い:
malloc() 関数は、メモリ空間を割り当てた後にメモリ空間を初期化することはできません。calloc() 関数は、空間を割り当てた後に、新しく割り当てられたメモリ空間を初期化します。また、malloc() 関数を使用してメモリを割り当てて照合した後、データの有効性を保証するために、割り当てられたメモリ領域を 0 にリセットする必要があります。