まず第一に、私は C プログラミングの専門家ではなく、現在、いくつかのレガシー C コードを読んでいます。そこで、2D マトリックスを初期化するための次の関数を見つけました。
long int **computeDistanceMatrix(void){
long int i;
long int j;
long int ** matrix;
matrix = malloc(sizeof(long int) * numberOfCities * numberOfCities +
sizeof(long int *) * numberOfCities);
if(matrix == NULL){
fprintf(stderr, "Out of memory, exit.");
exit(1);
}
for (i = 0; i < numberOfCities; i++){
matrix[i] = (long int*) (matrix + numberOfCities) + i * numberOfCities;
for (j = 0; j < numberOfCities; j++){
matrix[i][j] = distanceFunction(i, j);
}
}
return matrix;
}
これに似た、より明確に見えるものを期待していたので、コードが少し奇妙であることがわかりました。とにかく、次のことが気になりました。
- 行
malloc(sizeof(long int) * numberOfCities * numberOfCities + sizeof(long int *) * numberOfCities)
は、データ項目と各行へのポインターにメモリを割り当てていることを意味しますか? - とはどういう意味
matrix[i] = (long int*) (matrix + numberOfCities) + i * numberOfCities
ですか? 彼らがやろうとしていることは本当に理解できません。 - Cで2D配列のメモリ割り当てを行うより簡単な方法はありますか、それとも適切な方法ですか?