#include <stdio.h>
main()
{
myfunction();
}
void* myfunction() {
char *p;
*p = 0;
return (void*) &p;
}
当程序在Visual Studio上运行时,它无法编译,错误消息如下所示:
“错误2错误C2040:'myfunction':'void *()'与'int()'的间接等级不同”
有人可以轻松解释一下吗?
谢谢!
答案 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(它应该取消引用还是使用地址?)。