ポインタのアドレスをあなたのようなものに渡したいfreeDoubleArr
ようですfreeDoubleArr(&G, numnodes)
(私はむしろそれを呼び出しますdeleteDoubleArr
)。次に、持っている必要があります
void freeDoubleArr(double ***arrptr, int size)
{
double** arr = *arrptr;
for (int i = 0; i < size; i++)
free(arr[i]);
free (arr);
*arrptr = NULL;
}
ただし、正方行列が配列へのポインターの配列としてではなく、単純な配列として表されると判断することもできます。おそらく、(C99 以降の)柔軟な配列メンバーを使用して
struct matrix_st {
unsigned size;
double arr[]; /* flexible array of size*size elements */
};
arr
実際にはsize*size
要素の配列(それぞれが a )である規則を使用すると、便利な場合があり double
ます。
次に、クイック アクセスとミューテーター インライン関数を定義できます。
inline double get_element(struct matrix_st *m, int i, int j) {
assert (m != NULL);
unsigned s = m->size;
assert (i>=0 && i<s && j>=0 && j<s);
return m->arr[s*i+j];
}
inline void put_element(struct matrix_st* m, int i, int j, double x) {
assert (m != NULL);
unsigned s = m->size;
assert (i>=0 && i<s && j>=0 && j<s);
m->arr[i*s+j] = x;
}
( assert(3) ...<assert.h>
を参照)を使用して最適化し、上記のアクセサーとミューテーターを使用してコンパイルすると、コードよりもおそらく高速になります。-DNDEBUG
get_element
put_element
そして、マトリックスの作成は次のとおりです(ゼロ調整されたマトリックスを作成するため):
struct matrix_st* make_matrix (unsigned size) {
struct matrix_st* m = malloc(sizeof (struct matrix_st)
+ size*size*sizeof(double);
if (!m) { perror("malloc"); exit(EXIT_FAILURE); };
m->size = size;
memset(m->arr, 0, sizeof(double)*size*size);
return m;
}
次に、ユーザーは を 1 回呼び出すだけで、free
そのような行列を解放できます。
ところで、Linux でコーディングする場合は、valgrindメモリ リーク ディテクターとgdbデバッガーでコンパイルしgcc -Wall -g
て使用します。