是否需要施展无效?

时间:2010-02-05 15:27:12

标签: c

我让编译器抱怨(警告)关于以下内容。

我错过了什么吗?因为我认为这不需要演员

char* CurrentCh  = some ptr value;
int size;

size = func(&CurrentCh);

func定义如下

int func(void** ptr);

编译器警告:

  

传递'func'的参数1   来自不兼容的指针类型

THX

4 个答案:

答案 0 :(得分:7)

在C中,您可以将任何指针类型传递给期望void *的函数。它所说的是“我需要一个指向某个东西的指针,它指的是什么并不重要”。而void **说“我需要一个指向void *的指针,而不是指向另一个指针类型的指针”。

答案 1 :(得分:4)

在C中,void *是通用指针类型。但是void **不是通用指针指针类型!如果您希望能够以通用方式将指针传递给指针,那么无论如何都应该使用void *

#include <stdio.h>

void func(void *ptr)
{
    char **actual = ptr;
    const char *data = *actual;
    printf("%s\n", data);
}

int main(void)
{
    char *test = "Hello, world";
    func(&test);
    return 0;
}

答案 2 :(得分:3)

演员是必要的,因为你所做的是一种形式的双关语:你重新解释从char *void *指向的记忆。

对于这些类型,C标准保证这实际上起作用char *void *具有相同的表示。对于其他类型组合,情况可能并非如此。

标准的相关部分是第6.2.5节,第27节

  

指向void的指针应具有相同的指针   表示和对齐   要求作为指针   字符类型。同样,指针   合格或不合格的版本   兼容类型应具有   相同的表示和对齐   要求。所有指针   结构类型应具有相同的   表示和对齐   彼此的要求。所有   联合类型的指针应具有   相同的表示和对齐   彼此的要求。指针   其他类型不必相同   表示或对齐   要求。

并且不太相关(但也许也很有趣)第6.3.2.3节,第7节

  

指向对象或不完整的指针   type可以转换为指向   不同的对象或不完整的类型。   如果结果指针不是   正确对齐指向   类型,行为是未定义的。   否则,再转换回来时,   结果应该等于   原始指针。当指针指向   object被转换为指向a的指针   字符类型,结果指向   最低寻址字节   宾语。连续增量   结果,达到对象的大小,   产生指向剩余字节的指针   对象。

除此之外的任何事情都是特定于实现的。

答案 3 :(得分:0)

在C中,任何指针都可以向下转换为void *,但不能为void **。你需要一个明确的演员。