错误C2040:'void *()'的间接级别与'int()'不同

时间:2013-03-04 00:54:16

标签: c

#include <stdio.h>

main()
{
    myfunction();
}

void* myfunction() {
    char *p;
    *p = 0;
    return (void*) &p;
}

当程序在Visual Studio上运行时,它无法编译,错误消息如下所示:

“错误2错误C2040:'myfunction':'void *()'与'int()'的间接等级不同”

有人可以轻松解释一下吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

在使用myfunction()函数:

之前,您应该先添加main()声明
void* myfunction(void);

int main(void)
{
    myfunction();
    return 0;
}

void* myfunction(void) {
    char *p;
    *p = 0;
    return (void*) &p;
}

试一试。

答案 1 :(得分:2)

您的计划有两个问题。第一个问题是Nan Xiao's answer中提到的问题,编译器在myfunction看到你的电话时假设int myfunction()的签名是main

第二个问题是myfunction本身内部的间接级别不正确:

void* myfunction(void) {
    char *p; // Create a pointer to a character
    *p = 0;  // Set some random location to zero
    return (void*) &p; // Take the address of the pointer to a character,
                       // and turn it into a pointer to anything
}

也就是说,您的演员正在使用char **并使用它void *,这可能不是您想要的。

如果要返回转换为void指针的字符指针,只需返回字符指针本身,而不进行强制转换。

答案 2 :(得分:0)

编辑:我误读了你的代码。答案已更新。

正如@Nan Xiao所说,你应该在调用之前声明我的功能。我只能假设您的编译器错误地假设它存在并返回一个int,这会导致稍后的投诉。

我认为它抱怨该函数最初被“定义”为返回一个int,但现在它找到了一个返回void *的函数。 int有0个间接级别(它不是指针),而void *有一个(例如,它可能指向一个int)。继续,void **有两个间接级别(指向可以指向int的东西)。

在C中,虽然你可以安全地将(比方说)double转换为int,但是如果不解释如何执行它,你就不能将int *转换为int(它应该取消引用还是使用地址?)。