動的な配列の生成手順
動的な配列を生成するためには、C言語のmalloc
関数を使用します。
malloc
関数は、指定したサイズのメモリを動的に確保し、そのメモリの先頭アドレスを返します。
このメモリを配列として使用することで、必要な要素数を動的に確保することができます。
以下に、動的な配列の生成手順を示します。
- 必要な要素数と要素のデータ型を決定する
malloc
関数を使用して、必要なメモリを確保する- 確保したメモリを配列として使用する
- 配列に値を代入する
- 配列を使用した処理を行う
- 不要になったメモリを解放する
以下では、具体的なコード例を示します。
#include <stdio.h>
#include <stdlib.h>
int main() {
int n; // 要素数
int* array; // 配列のポインタ
// 1. 必要な要素数を入力する
printf("要素数を入力してください: ");
scanf("%d", &n);
// 2. メモリの確保
array = (int*)malloc(n * sizeof(int));
// 3. 配列として使用する
if (array == NULL) {
printf("メモリの確保に失敗しました\n");
return 1;
}
// 4. 配列に値を代入する
for (int i = 0; i < n; i++) {
array[i] = i + 1;
}
// 5. 配列を使用した処理を行う
printf("配列の要素: ");
for (int i = 0; i < n; i++) {
printf("%d ", array[i]);
}
printf("\n");
// 6. メモリの解放
free(array);
return 0;
}
上記のコードでは、ユーザーに要素数を入力させ、その要素数分のメモリをmalloc
関数で確保しています。
確保したメモリを配列として使用し、値を代入しています。
最後に、メモリを解放しています。
このように、malloc
関数を使用することで、動的な配列を生成することができます。
必要な要素数をユーザーに入力させることで、柔軟に配列のサイズを変更することができます。
また、メモリの解放も忘れずに行うようにしましょう。
動的な配列のサイズの変更方法
動的な配列を使用すると、実行時に配列のサイズを変更することができます。
これは、プログラムの実行中に必要なだけのメモリを確保するために便利です。
C言語では、realloc
関数を使用して動的な配列のサイズを変更することができます。
realloc
関数は、既存のメモリブロックのサイズを変更するために使用されます。
新しいサイズのメモリブロックを確保し、元のメモリブロックの内容を新しいメモリブロックにコピーします。
以下にrealloc
関数の使用方法を示します。
#include <stdio.h>
#include <stdlib.h>
int main() {
int* array = (int*)malloc(5 * sizeof(int)); // 初期の配列を確保
// 配列の要素を表示
printf("初期の配列: ");
for (int i = 0; i < 5; i++) {
printf("%d ", array[i]);
}
printf("\n");
// 配列のサイズを変更
array = (int*)realloc(array, 10 * sizeof(int));
// 新しい要素を追加
for (int i = 5; i < 10; i++) {
array[i] = i;
}
// 変更後の配列を表示
printf("変更後の配列: ");
for (int i = 0; i < 10; i++) {
printf("%d ", array[i]);
}
printf("\n");
free(array); // メモリを解放
return 0;
}
上記のコードでは、最初にmalloc
関数を使用して5つの要素を持つ配列を確保しています。
その後、realloc
関数を使用して配列のサイズを10に変更し、新しい要素を追加しています。
最後に、free
関数を使用してメモリを解放しています。
実行結果は以下のようになります。
初期の配列: 0 0 0 0 0
変更後の配列: 0 0 0 0 0 5 6 7 8 9
このように、realloc
関数を使用することで、動的な配列のサイズを変更することができます。
ただし、realloc
関数は元のメモリブロックの内容を新しいメモリブロックにコピーするため、パフォーマンスの面で注意が必要です。
また、realloc
関数は新しいメモリブロックの確保に失敗した場合にはNULL
を返すため、エラーチェックも行う必要があります。