3 つの float の配列へのポインターの配列を作成したいと考えています。これを行う正しい方法は何ですか?
なぜあなたは欲しいのarray of pointers to arrays
ですか?array of arrays
十分ではありませんか?(配列はすでにポインターのようなものであり、値で渡されるのではなく、配列が引数として関数に渡されるときに最初の要素のアドレスが渡されることに注意してください)。
// stack allocation, no need to free
float array[SIZE][3];
for (int i = 0; i < SIZE; i++) {
// do something with array[i][0], array[i][1], array[i][2]
}
では、どうすればデータを解放できますか?
この場合、データはスタックに割り当てられているため、そうする必要はありません (範囲外になると自動的にクリーンアップされます)。経験則として、メモリを割り当てるたびに、対応する解放が必要になるということを覚えておいてください。したがって、float の配列にメモリを割り当てると、次のようになります。
float* arr = malloc(sizeof(float) * 3); // array of 3 floats
次に、配列で free を呼び出すだけでよくmalloc'd
、個々のフロートを解放する必要はありません。次のようにネストされた割り当てを実行する場合
// array of length SIZE, consisting of float pointers
float** arr = malloc(sizeof(float*) * SIZE);
// allocate the array of 3 floats at each index
for (int i = 0; i < SIZE; i++)
arr[i] = malloc(sizeof(float) * 3);
free
次に、次のようにfor everymalloc
を実行する必要があります。
// free the individual arrays
for (int i = 0; i < SIZE; i++)
free(arr[i]);
// free the array of arrays
free(arr);
ここで学ぶべき教訓は、配列をまとめて動的に割り当てることを避けることです。std::vector
またはスタック割り当て配列のいずれかに固執します。