17

次のような double ポインターを使用して 2 次元行列を作成しました。

int** pt; pt = (int*) malloc(sizeof(int)*10);

ポインタがそのように解放されることを知っています

free(ptr);

ダブルポインターを解放するにはどうすればよいですか?

何かを印刷した後、そのメモリを解放してプログラムを終了するとどうなるでしょうか? 最終的なメモリは使用したもので構成されていますか、それとも初期と同じになりますか?

4

2 に答える 2

37

マトリックスがあるとしますmat

int** mat = malloc(10 * sizeof(int*));
for (int i=0; i<10; ++i) {
  mat[i] = malloc(10 * sizeof(int));
}

次に、行列の各行を解放できます(事前にそれぞれを正しく初期化したと仮定します):

for (int i=0; i<10; ++i) {
  free(mat[i]);
}

次に、最上位ポインターを解放します。

free(mat);

2 番目の質問: メモリを割り当てて使用すると、そのメモリが変更されます。これは、解放しても「元に戻す」ことはできません (ただし、確実に/移植可能にアクセスすることはできなくなります)。

: s ではなくポインタへsizeof(int*)のポインタを割り当てているため、最上位の malloc が使用されています。 とのサイズは同じであるとは限りません。intintint*int

于 2012-06-13T13:03:21.450 に答える
2

マトリックスが「不規則」でない場合、つまりすべての行の長さが同じである場合は、次のことを検討してください。

  1. 手動でアクセスします。つまり、値の 1D 配列として扱い、別のwidth値を保持します。( x,y )の要素にアクセスするには、 を使用しますmat[y * width + x]
  2. の利便性が本当に必要な場合はmat[y][x]、 を 1 回呼び出してポインター配列とすべての行の両方malloc()を割り当て、各行を指すようにポインターを初期化することで改善できます。これには、1 回の呼び出しですべて解放できるという利点があります。free(mat);

2 番目のアプローチは次のようになります。

double ** matrix_new(size_t width, size_t height)
{
  double **p = malloc(height * sizeof *p + width * height * sizeof **p);
  double *e1 = (double *) (p + height);
  size_t i;

  for(i = 0; i < height; ++i)
    p[i] = e1 + i * width;
  return p;
}

注: 上記はテストされていません。製品コードは、使用する前に明らかにエラーをチェックする必要がありpます。

于 2012-06-13T13:13:05.633 に答える