メモリを割り当て、メモリ割り当てが完了したかどうかを確認する関数を作成しようとしています。任意のメモリタイプを割り当てることができるように、私は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アレイ。より良い方法があれば、例を示してください。しかし、私は依然として、配列が現時点での重要な問題である必要があります。
'TEMP =はcalloc(10、pointer_type)' ...あなたは何かをかぐないしますか? –
また、配列に適切なサイズを割り当てないなど、コンパイラーには見られない他の問題もあります。 'double'の配列の配列を割り当てるには、例えば、で始まります。 'calloc(10、sizeof(double *))'です。 –
@Someprogrammerdude私はまだ正しいサイズを与えているので、pointer_type = sizeof(double)でこれを達成してはいけませんか? – Hobojoe