3
#include <stdio.h>

main()
{
    myfunction();
}

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

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

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

有人可以做一个简单的解释吗?

谢谢!

4

3 回答 3

4

您应该在函数中myfunction()使用它之前添加声明:main()

void* myfunction(void);

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

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

试试看。

于 2013-03-04T00:58:31.243 回答
2

你的程序有两个问题。第一个问题是Nan Xiao 的回答中提到的问题,编译器在看到你的调用时假设myfunctionis的签名。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 指针,只需返回字符指针本身,不进行转换。

于 2013-03-04T01:19:05.967 回答
0

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

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

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

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

于 2013-03-04T00:59:01.417 回答