#include <stdio.h>
main()
{
myfunction();
}
void* myfunction() {
char *p;
*p = 0;
return (void*) &p;
}当程序在Visual Studio中运行时,它无法编译,错误消息如下:
“错误2 C2040:'myfunction‘:'void *()’与'int ()‘的间接级别不同”
有没有人能简单解释一下?
谢谢!
发布于 2013-03-04 08:58:31
在main()函数中使用之前,需要添加myfunction()的声明:
void* myfunction(void);
int main(void)
{
myfunction();
return 0;
}
void* myfunction(void) {
char *p;
*p = 0;
return (void*) &p;
}试试看。
发布于 2013-03-04 09:19:06
你的程序有两个问题。第一个问题是在Nan Xiao's answer中提到的问题,即编译器在看到您在myfunction中的调用时,假定main的签名为int myfunction()。
第二个问题是你在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 *,这可能不是您想要的。
如果您想将字符指针强制转换为空指针,只需返回字符指针本身,而不进行强制转换。
发布于 2013-03-04 08:59:01
编辑:我读错了你的代码。答案已更新。
正如@Nan肖注意到的那样,你应该在调用myfunction之前声明它。我只能假设您的编译器错误地假设它存在,并返回一个int,这会导致稍后的抱怨。
我认为它是在抱怨这个函数最初被“定义”为返回一个int,但现在它找到了一个返回void*的函数。int有0个间接层(它不是一个指针),而void*有一个(例如,它可以指向一个int )。继续,void**有两个级别的间接性(指向可以指向int的东西)。
在C中,虽然您可以安全地将double转换为int,但在不解释如何操作的情况下,您无法将int*转换为int (应该取消引用还是使用地址?)。
https://stackoverflow.com/questions/15192891
复制相似问题