我有一个创建指针数组的函数。分配内存的函数通过传递给函数的参数返回新的内存指针。可以重现问题的最简单代码如下:
void foo (void** new_mem, size_t bytes)
{
*new_mem = malloc(bytes);
}
int main (void)
{
int** ptr_arr; // Want to create an array of pointers
foo(&ptr_arr, sizeof(int*)*100); // Create an array size of 100
// compiler emits warning:
// 'void **' differs in levels of indirection from 'int ***'
return 0;
}
我可以像这样转换传递给 foo 的第一个参数:'(void**)&ptr_arr' 来消除警告,但是,我想知道:是否有更合适的解决方案?
最佳答案
虽然可以保证从 int *
到 void *
的转换,但是对于从 int **
到 的转换没有这样的保证无效 **
。要思考为什么会这样,请考虑 int *
实际上可能小于 void *
。因此,使用 void **
指针遍历 int *
数组将走错步幅并获取错误数据。此外,不能保证 int *
将使用与 void *
相同的表示,只是有一种方法可以在它们之间进行转换。
在实践中,我不知道有哪台机器会失败。但标准并不能保证这一点。
编辑:哎呀,每个人都怎么说传递 int ***
。但即使你传递了一个 int **
,上面的内容仍然适用。
EDIT2:comp.lang.c FAQ 有一个 excellent discussion关于这个。
关于c - 实际参数的指针不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619606/