我正在尝试创建一个分配内存并检查内存分配是否已完成的函数。为了允许分配任何内存类型,我已将函数设置为接受void,如下所示:foo(void ***memory, size_t pointer_type)
。这里的目的是允许用户将任何指针输入到第一部分,然后在第二部分中输入指针类型的大小以正确分配,例如:
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帖子时发现了这个想法,解释说这允许创建任何数组类型,但编译器会发出以下警告:
警告:传递&#39; foo&#39;的参数1来自不兼容的指针类型 注意:预期
void ***'
但参数类型为'double ***'
这告诉我,我所做的事情是不正确的,但是在分配后将数组视为双数组时,一切正常,所以我迷失了做什么。
编辑:好的,所以三星级的使用是从一个单独的2D阵列函数中分配内存,这就是我的表现方式,即如果我使用pointer[a][b]=10
那么它就会行动像一个二维数组。如果有更好的方法那么请显示一个例子,但是我仍然要求阵列是任何类型,目前是紧迫的事情。
答案 0 :(得分:1)
仅 a void*
被视为void
- 指针,其他指针的转换是隐式完成的(在C中)。
void**
是指向void
指针的指针,指针不是void
指针。这同样适用于void***
。
所以要修复你引用改变的错误
int foo(void ***memory,size_t pointer_type)
是
int foo(void *memory, size_t pointer_type)
答案 1 :(得分:-2)
编译器会生成正确的警告,因为类型
void ***
与
类型不同double ***
显式强制转换将修复警告:
if (foo((void ***)&pointer, sizeof(double))==-1)