c - 实际参数的指针不匹配?

标签 c visual-studio pointers memory-management c99

我有一个创建指针数组的函数。分配内存的函数通过传递给函数的参数返回新的内存指针。可以重现问题的最简单代码如下:

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/

相关文章:

C 段错误 11

c - scanf 语句的参数

visual-studio - Visual Studio 测试项目可以处理事件和委托(delegate)吗?

c - 堆栈溢出与 C 中的指针

c - 将数组传递给 C 中的指针数组

c - 使用指向指针的指针初始化 C 结构

c - 在函数中分配动态数组并将其发送回 C 中的调用者

html - 网络爬虫类型程序 - wiki 分离度

visual-studio - 在 Visual Studio 中对文件进行分组

c++ - 编译器错误,C++