无法将size_t * arg []传递给需要void指针数组的函数

时间:2016-10-14 12:40:31

标签: c++ pointers

据我所知,我的函数f(void *data[])应该接收一个通用指针数组作为参数。 尽管如此,当我尝试

时出现编译错误
size_t *cnt[8];
... // initialize pointers in cnt
f(cnt);

特别是g ++会自动将f的原型转换为f(void**),然后将cnt转换为size_t**,而不是说它无法转换size_t** } void**

2 个答案:

答案 0 :(得分:0)

  

g ++会自动将f的原型转换为f(void**)

我发现使用精确的术语有助于更好地理解编程语言。将f 转换转换为f(void**)可能会让人感到困惑。这并非迂腐地说这个案例。f(void *data[])只是写f(void** data)的另一种方式。这种替代语法是 syntactic sugar 的一种情况。

转换通常意味着将一种类型更改为另一种类型。您的功能声明中没有涉及转换。

此外,这种语法糖并非特定于编译器g ++。此行为在C ++标准中指定。

f(cnt);
     

然后它将cnt转换为size_t**

确实是转换。这是一种称为衰减的特殊转换类型。这种隐式转换也是一种语法糖。它在语义上与写作相同:

f(&cnt[0]);
  

无法将size_t * arg []传递给需要void指针数组的函数

这是正确的。

实际上,您的函数需要void**,但您传递了函数size_t**size_t**无法隐式转换为void**,因此您的程序格式不正确。

解决问题的方法:

1)改为使用f(size_t**)

2)首先使用void*数组

3)将size_t *cnt[8]复制到另一个数组void *temp[8],然后将其传递给该函数。

4)(不推荐)将cnt投射到void**并希望它能达到您的功能所期望的效果。

答案 1 :(得分:-1)

C允许从任何类型的指针指针到void指针到指针的隐式转换,但C ++不允许这样做。您需要明确地将cnt投射到void **