各構造に1つのディメンションを格納するとき、私はそれらが正方行列であるとみなします。
は、私はあなたが便宜上ポインタのポインタを使用すると考えているので、あなたは、この方法は必要ありませ連続したメモリ空間を、あなたは1つの制約のために/割り当て解除メモリを割り当てることができません:
int allocate_Constraint(Constraint *pConstraint, int n)
{
// You need room for n * n integers, right ?
int *p = malloc(n * n * sizeof(int));
if (p == NULL)
{
return 0; // memory insufficient => return false
}
// You need room for n pointers to integer
pConstraint->constraint = malloc(n * sizeof(int *));
if (pConstraint->constraint == NULL)
{
free(p);
return 0; // memory insufficient => return false
}
for (int i = 0; i < n; i++)
{
// Each line starts n integers farther than the previous one
pConstraint->constraint[i] = p + n * i;
}
// Now it's good, your matrix is usable.
pConstraint->max_domain = n;
return 1;
}
void deallocate_Constraint(Constraint *pConstraint)
{
if (pConstraint->max_domain > 0)
{
free(pConstraint->constraint[0]);
free(pConstraint->constraint);
pConstraint->constraint = NULL;
pConstraint->max_domain = 0;
}
}
int main()
{
Constraint c = {constraint: NULL, max_domain:0};
if (allocate_Constraint(&c, 10))
{
// do stuff with c
deallocate_Constraint(&c);
}
return 0;
}
や機能が割り当てるを/ DEALLOCATE制約行列は次のようになります。
int allocate_Constraint_mat(Constraint_mat *pConstraint_mat, int n)
{
// You need room for n * n Constraint(s), right ?
Constraint *p = malloc(n * n * sizeof(Constraint));
if (p == NULL)
{
return 0; // memory insufficient => return false
}
// You need room for n pointers to Constraint
pConstraint_mat->constraint_matrix = malloc(n * sizeof(Constraint *));
if (pConstraint_mat->constraint_matrix == NULL)
{
free(p);
return 0; // memory insufficient => return false
}
for (int i = 0; i < n; i++)
{
// Each line starts n Constraint(s) farther than the previous one
pConstraint_mat->constraint_matrix[i] = p + n * i;
}
// Initializing to empty matrices
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
pConstraint_mat->constraint_matrix[i][j].constraint = NULL;
pConstraint_mat->constraint_matrix[i][j].max_domain = 0;
}
}
// Now it's good, your matrix is usable.
pConstraint_mat->max_var = n;
return 1;
}
void deallocate_Constraint_mat(Constraint_mat *pConstraint_mat)
{
if (pConstraint_mat->max_var > 0)
{
free(pConstraint_mat->constraint_matrix[0]);
free(pConstraint_mat->constraint_matrix);
pConstraint_mat->constraint_matrix = NULL;
pConstraint_mat->max_var = 0;
}
}
編集:allocate_Constraintについての説明()
ですから、制約cを持って、あなたが割り当てたいですそれはallocate_Constraint(&c, n)
です。 c.constraint[i]
を有効にする必要がありますので、使用することができます。したがって、c.constraint
は、n個のポインタをint
に格納するのに十分なメモリを必要とします。そのための機能であり:
pConstraint->constraint = malloc(n * sizeof(int *));
今は有効であるために、すべてのc.constraint[i][j]
を必要とし、あなたは彼らが当然の独立した値である必要があります。したがって、それぞれ(int
へのポインタ)は、n int
のための部屋を持つアドレスを指定します。合計でn * n int
です。 、あなたは、一度だけ割り当てる
for (int i = 0; i < n; i++)
{
pConstraint->constraint[i] = malloc(n * sizeof(int));
}
第二の方法、あなたは、大規模な割り当てられたメモリ空間にc.constraint[i]
秒を派遣:私はお勧めしません
第一の方法は、n個int
のために部屋の割り当てをn個されるだろう:
p = malloc(n * n * sizeof(int));
for (int i = 0; i < n; i++)
{
pConstraint->constraint[i] = p + i * n;
}
「何か」とは何ですか? –
これらは「行列」ではなくポインタです。行列は与えられた次元を持つ 'int matrix [5] [6]'のようなものです。 – jdarthenay
@VladfromMoscow mallocの中に?私が知りたいこと。 何かが私の構造の中にあるもののインスタンス化です。 – Traknir