首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ANSI-C中,void**是可接受的类型吗?

在ANSI-C中,void**是可接受的类型吗?
EN

Stack Overflow用户
提问于 2008-10-29 09:59:27
回答 6查看 3.4K关注 0票数 7

我看过一个函数,它的原型是:

代码语言:javascript
复制
int myfunc(void** ppt)

此函数以a= myfunc(mystruct **var1)的形式在C文件中调用;

其中mystruct是我们所拥有的结构之一的类型--胡枝子。

这在MSVC6.0中不存在任何编译错误,但是当我用其他C编译器编译它时,它会在调用此函数的地方出现一个错误,并带有错误消息:

类型mystruct **的参数与void **类型的参数不兼容

myfunc()的参数保持为void**,因为它似乎是一种泛型malloc类型的函数,用于调用不同的结构变量类型来分配内存。

  1. 在C标准/任何C编译器中是否允许使用void **之类的类型?
  2. 我该怎么解决这个问题?我尝试将函数调用参数转换为mystruct**,但是它没有工作

-AD

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-10-29 10:03:33

void**是有效的,但是,根据您的错误消息,您可能必须显式地将参数转换为如下:

代码语言:javascript
复制
mystruct **var1;
x = myfunc ((void**) var1);

这是因为myfunc函数需要void**类型。虽然void*可以隐式转换到任何其他指针,但对于双指针则不是这样--您需要显式地转换它。

票数 8
EN

Stack Overflow用户

发布于 2008-10-30 15:51:31

常见问题解答问题4.9中详细解决了这个问题。简而言之,他们说--严格地说不是可移植的--可以将任意的指针指向void **;他们接着解释说,“像这样的代码可能会工作,有时也会被推荐,但是它依赖于所有指针类型具有相同的内部表示(这是常见的,但不是通用的)。”他们接着解释说,“您所使用的任何void **值都必须是某个实际void *值的地址;像(void **)&dp这样的强制转换虽然可能会使编译器关闭,但是不可移植的(甚至可能不做您想做的事情)。”

因此,您可以使用以下代码安全地/可移植地实现所需的行为:

代码语言:javascript
复制
some_type *var1 = foo();
void *tmp_void_ptr = (void *)var1;
myfunc(&tmp_void_ptr);
票数 22
EN

Stack Overflow用户

发布于 2008-10-29 10:44:15

编译器不能自动从mystruct**转换到void**是有原因的。

考虑以下代码:

代码语言:javascript
复制
void stupid(struct mystruct **a, struct myotherstruct **b)
{
    void **x = (void **)a;
    *x = *b;
}

编译器不会抱怨从myotherstruct*void**x = *b行中的隐式转换,即使该行试图将指向myotherstruct的指针放在只应该放置指向mystruct的指针的位置。

实际上,在前面的一行中,错误是将“指针转换为可以将指向mystruct的指针放置的位置”转换为“指向指向任何东西的指针的位置的指针”。这就是没有隐式强制转换的原因。当然,当您使用显式强制转换时,编译器假定您知道您在做什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/246280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档