C 言語の静的配列と動的配列
C言語には、2種類の配列があります:
- 静的配列:コンパイル時にメモリが割り当てられ、サイズは固定です。
- 動的配列:実行時に手動でメモリを割り当て、サイズは変更可能です。
静的配列のライフサイクルはスコープに関連しており、動的配列のライフサイクルはプログラマーが制御します。
動的配列を使用する際は、メモリリークや無効なメモリへのアクセスといった問題を避けるために、メモリを適切に割り当てて解放することに注意する必要があります。
静的配列
静的配列とは、コンパイル時にサイズが決定される配列であり、そのサイズはプログラムの実行中に変更できません。
C言語では、静的配列のメモリはスタック領域に割り当てられ、通常は角括弧を使用して[]定義します。
静的配列の特徴は次のとおりです:
- メモリ割り当て:静的配列のメモリは通常スタック上に割り当てられ、関数の呼び出しと戻りに伴って自動的に管理されます。
- サイズ固定:定義時にサイズを指定し、プログラムの実行中に変更することはできません。
- 効率:スタック上にメモリが割り当てられるため、アクセス速度が速いです。
- ライフサイクル:静的配列のライフサイクルは定義時に始まります。関数内で定義された場合、ライフサイクルは関数の呼び出しと同じです。グローバルスコープで定義された場合、ライフサイクルはプログラム全体の実行を通して続きます。
静的配列の宣言と初期化の例:
int staticArray[5]; // 静态数组声明
int staticArray[] = {1, 2, 3, 4, 5}; // 静态数组声明并初始化静的配列の場合、sizeof演算子を使用して配列の長さを取得できます。例:int array[] = {1, 2, 3, 4, 5};
int length = sizeof(array) / sizeof(array[0]);上記のコードでは、sizeof(array) は配列全体が占有するバイト数を返し、sizeof(array
以上は簡単な静的配列の例です:
例
int main() {
int staticArray[] = {1, 2, 3, 4, 5}; // 静的配列の宣言と初期化
int length = sizeof(staticArray) / sizeof(staticArray[0]);
printf("静的配列: ");
for (int i = 0; i < length; i++) {
printf("%d ", staticArray[i]);
}
printf("\n");
return 0;
}
上記の例では、5つの整数要素を含む静的配列 staticArray を宣言して初期化し、sizeof演算子を使用して静的配列の長さを計算し、ループを使用して配列の要素を走査して出力しました。
出力結果:
静态数组: 1 2 3 4 5
動的配列
動的配列は、実行時に動的メモリ割り当て関数(例:mallocとcalloc)を使用して手動でメモリを割り当てる配列です。
動的配列の特徴は次のとおりです:
- メモリ割り当て:動的配列のメモリ領域は、実行時に動的メモリ割り当て関数によって手動で割り当てられ、ヒープ上に格納されます。メモリを確保するには、
malloc、callocなどの関数を使用してメモリを割り当て、free関数を使用してメモリを解放します。 - サイズ変更可能:動的配列のサイズは実行時に必要に応じて調整でき、
realloc関数を使用してメモリを再割り当てすると、配列のサイズを変更できます。 - ライフサイクル:動的配列のライフサイクルはプログラマーが制御します。配列を使用した後は、メモリリークを避けるために手動でメモリを解放する必要があります。
動的配列の宣言、メモリ割り当て、解放の例:
int size = 5; int *dynamicArray = (int *)malloc(size * sizeof(int)); // 动态数组内存分配 // 使用动态数组 free(dynamicArray); // 动态数组内存释放
動的に割り当てられた配列では、動的メモリ割り当て時に配列の長さを保存し、必要に応じてその長さを使用できます。例:
int size = 5; // 数组长度 int *array = malloc(size * sizeof(int)); // 使用数组 free(array); // 释放内存
上記のコードでは、malloc関数を使用して整数型の配列を動的に割り当て、その長さを変数 size に保存しました。その後、必要に応じてこの長さを使用して操作できます。配列を使用した後は、free関数を使用してメモリを解放します。
注意:動的配列の使用ではメモリ管理に注意し、配列が不要になった時点でメモリを解放して、メモリリークや無効なメモリ位置へのアクセスを避けるようにしてください。
以上は簡単な動的配列の使用例です:
例
#include <stdlib.h>
int main() {
int size = 5;
int *dynamicArray = (int *)malloc(size * sizeof(int)); // 動的配列のメモリ割り当て
if (dynamicArray == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
printf("Enter %d elements: ", size);
for (int i = 0; i < size; i++) {
scanf("%d", &dynamicArray[i]);
}
printf("Dynamic Array: ");
for (int i = 0; i < size; i++) {
printf("%d ", dynamicArray[i]);
}
printf("\n");
free(dynamicArray); // 動的配列のメモリ解放
return 0;
}
上記の例では、最初に変数 size を宣言して動的配列のサイズを指定しました。
次に、malloc関数を使用して動的配列にメモリを割り当て、sizeof演算子を使用して必要なメモリサイズを計算しました。
その後、ループとscanf関数を使用して、ユーザー入力から要素の値を読み取り、動的配列に格納しました。
最後に、ループを使用して動的配列の要素を走査し、出力します。プログラムの終了時に、free関数を使用して動的配列が占有していたメモリを解放します。
動的配列を使用する際は、メモリ割り当てが成功したかどうか(つまり dynamicArray が NULL かどうか)を確認して、メモリ割り当て失敗時にエラーが発生しないようにしてください。
その他の拡張
C配列