0

2D 配列に割り当てたメモリを解放しようとしています。

コードは正常に動作していますが、コンパイル時に常に警告が表示されます。

2 つの異なる方法を試しましたが、毎回新しい警告が表示されます。

    int* array = fillArray(); //malloc (n*m*sizeof*array)

    ...
    DeallocateMemory(array, n*m); //Where n and m are length and height

    void DeallocateMemory(int* array, int length)
    {
          for (int i = 0; i < length; i++){
              //free(array[i]);
              //free((void*)array[i]);
          }
    }
    free(array);

わかりましたので、最初は書きfree(array[i])ましたが、警告には次のように書かれていました:

* の引数 1 を渡すとfree、キャストなしで整数からポインターが作成されます 注: 期待されvoid*ますが、引数は型ですint*

だから私は書いvoid*たが、今の警告は:

異なるサイズの整数からポインターにキャストする

両方のエラーを取り除くにはどうすればよいですか? ありがとう!

4

3 に答える 3

2

arrayは へのポインタであるためintarray[i]int; しようとすることfree(array[i])は、整数を解放しようとすることと同じです-それは意味がありません.コンパイラはそれについて不平を言っています.

これが整数を保持するフラットな配列であると仮定すると、解放するために必要なことは次のとおりです。

free(array);
于 2013-10-28T20:26:26.670 に答える
2

free(array);配列のすべての場所を解放する必要はありません。配列のすべての場所で、警告の原因となるint解放が格納されます。int

あなたが2D配列を持っているなら、あなたがしたようにそれだけが意味をなします。

 //Allocate the memory
 int** array = malloc(n * sizeof(int*));
 for (unsigned int k = 0; k < n; k++) {
     array[k] = malloc(m * sizeof(int));
 }

 //Deallocate the memory
void DeallocateMemory(int** array, int n) {
      for (int i = 0; i < n; i++){
           free(array[i]);
      }
}
于 2013-10-28T20:27:26.580 に答える
0

ポインタ配列のポインタを使用するfreeと、質問のように記憶できます。つまり、メモリを割り当てて、そのような 2 次元配列を構築する場合です。

int **array = malloc(m * sizeof(int *));
for (i = 0; i < m; i++) { 
  array[i]=malloc(n * sizeof(int));
}

そして、そのように割り当てられたすべてのメモリを解放できます。

for (i = 0; i < m; i++) { 
  free(array[i]);
}
free(array);

最後に、1 次元配列を使用し、他の回答のように割り当てられたメモリを解放できます。

于 2013-10-28T20:35:43.967 に答える