2017-02-22 19 views
-2

メモリを割り当て、メモリ割り当てが完了したかどうかを確認する関数を作成しようとしています。任意のメモリタイプを割り当てることができるように、私はvoidを受け入れる関数を以下のように設定しました:foo(void ***memory, size_t pointer_type)。この例ではダブルスの配列があるべきvoidポインタを使用するとコンパイラの警告エラーが発生する

int foo(void ***memory,size_t pointer_type) 
{ 
    void **temp; 
    if((temp=calloc(10,pointer_type))==NULL) 
    { 
     return(-1); 
    } 
    for(i=0;i<10;i++) 
    { 
     if((temp[i]=calloc(10,pointer_type))==NULL) 
     { 
      // free array as can't be used 
      for(i;i>=0;i--) 
      { 
       free(temp[i]); 
       temp[i]=NULL; 
      } 
      free(temp); 
      temp=NULL; 
      return(-1); 
     } 
    } 
    *memory=temp; 
    return(0); 
} 

int main() 
{ 

    double **pointer; 
    if(foo(&pointer, sizeof(double))==-1) 
    { 
     return(-1); 
    } 


    //do stuff then free memory 


    return (0); 
} 

:ここでの意図は、次のような、入力するユーザに、最初のセクションと正しく割り当てる第二にポインタ型のサイズに任意のポインタを可能にすることです作成した。これは、任意の配列型を作成することを可能にすることを説明する他のSEの記事を読んだとき、私はこの考えに出くわしました、しかし、コンパイラは次の警告提供します:

を警告:互換性のないポインタ型 ノートから「foo」での引数1を渡します:void ***'を期待しますが、引数はこれが割り当てすべてが正常に動作した後、二重配列として配列を処理するときしかし私が何をするかのように失わ午前、私が行っている何かが間違っていることを私に示唆タイプの'double ***'

です。

編集:3次元の使用は、2D配列用の別の関数からメモリを割り当てることです。私がそれを行う方法を示しました。すなわち、pointer[a][b]=10を使用した場合、2Dアレイ。より良い方法があれば、例を示してください。しかし、私は依然として、配列が現時点での重要な問題である必要があります。

+0

'TEMP =はcalloc(10、pointer_type)' ...あなたは何かをかぐないしますか? –

+0

また、配列に適切なサイズを割り当てないなど、コンパイラーには見られない他の問題もあります。 'double'の配列の配列を割り当てるには、例えば、で始まります。 'calloc(10、sizeof(double *))'です。 –

+0

@Someprogrammerdude私はまだ正しいサイズを与えているので、pointer_type = sizeof(double)でこれを達成してはいけませんか? – Hobojoe

答えて

1

a void*voidポインタと見なされ、他のポインタの変換は暗黙的に(Cでは)行われます。

void**void -pointerないvoid -pointerへのポインタです。 void***についても同様です。

だからエラーを修正するには、あなたが変更

int foo(void ***memory,size_t pointer_type) 

を引用

int foo(void *memory, size_t pointer_type) 
-2

タイプ

void *** 

は、明示的なキャストが警告修正するタイプ

double *** 

異なるため、コンパイラは、右の警告を生成しますのみ

if (foo((void ***)&pointer, sizeof(double))==-1) 
+1

しかし、明示的なキャストは、これが未定義の振る舞いを持つ可能性があると修正しません。 –

関連する問題