電磁気シミュレーションのコースワーク用のコードを書いていて、問題が発生しました。元の計算を最大10^8要素の非常に大きなメッシュに拡張することで少し余分なことをすることにしたので、今度はmalloc()を使用する必要があります。
これまでのところ、非常に優れていますが、コードをライブラリに保持してから、コンパイラのインラインオプションを使用してコンパイルすることを好むため、関数間で情報を渡す方法が必要でした。そこで、構造体を使用してメッシュのパラメーターと情報の配列へのポインターを追跡し始めました。構造体を次のように定義しました。
typedef struct {
int height;
int width;
int bottom; //position of the bottom node
unsigned int*** dat_ptr;//the pointer to the array with all the data
} array_info;
unsigned intへのトリプルポインタは、2D配列へのポインタです。そうしないと値によって渡され、関数内から変更できないため、この方法で行う必要があります。
ここで、次の関数を使用して構造体にメモリを割り当てようとすると、次のようになります。
void create_array(array_info A)//the function accepts struct of type "array_info" as argument
{
int i;
unsigned int** array = malloc(sizeof(*array) * A.height);//creates an array of arrays
for(i = 0; i<A.height; ++i)
{
array[i] = malloc(sizeof(**array) * A.width);//creates an array for each row
}
*A.dat_ptr=array;//assigns the position of the array to the input pointer
}
操作を実行するとセグメンテーション違反が発生します。理由がわかりません:sizeof(* A.dat_ptr)はsizeof(array)と同じです。したがって、最悪の場合、割り当てラインではなく、ラインのどこかでジブリッシュになるはずですよね?