首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误C2040:'void *()‘与'int ()’的间接级别不同

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

Stack Overflow用户
提问于 2013-03-04 08:54:16
回答 3查看 9.8K关注 0票数 3
代码语言:javascript
复制
#include <stdio.h>

main()
{
    myfunction();
}

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

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

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

有没有人能简单解释一下?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2013-03-04 08:58:31

main()函数中使用之前,需要添加myfunction()的声明:

代码语言:javascript
复制
void* myfunction(void);

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

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

试试看。

票数 4
EN

Stack Overflow用户

发布于 2013-03-04 09:19:06

你的程序有两个问题。第一个问题是在Nan Xiao's answer中提到的问题,即编译器在看到您在myfunction中的调用时,假定main的签名为int myfunction()

第二个问题是你在myfunction内部有不正确的间接层:

代码语言:javascript
复制
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 *,这可能不是您想要的。

如果您想将字符指针强制转换为空指针,只需返回字符指针本身,而不进行强制转换。

票数 2
EN

Stack Overflow用户

发布于 2013-03-04 08:59:01

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

正如@Nan肖注意到的那样,你应该在调用myfunction之前声明它。我只能假设您的编译器错误地假设它存在,并返回一个int,这会导致稍后的抱怨。

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

在C中,虽然您可以安全地将double转换为int,但在不解释如何操作的情况下,您无法将int*转换为int (应该取消引用还是使用地址?)。

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

https://stackoverflow.com/questions/15192891

复制
相关文章

相似问题

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