【发布时间】:2021-10-10 00:42:37
【问题描述】:
我写了一个空指针函数来求整数的平方。
void * square(const void * num);
int main(){
int x = 6;
void * ptr = &x;
printf("%d", square(ptr));
}
void * square(const void * num){
return (*(int * )num) * (*(int *)num);
}
据我所知,这不应该起作用,因为函数应该返回一个指向(*(int * )num) * (*(int *)num) 结果的空指针,而不是结果本身。但是,代码仍然有效。有人请解释一下。
【问题讨论】:
-
编译时可能会出现警告?任何理智的编译器都应该警告您返回类型与函数签名不匹配。
-
指针是数字。您正在返回一个数字,因此它被隐式转换回
void*,然后在您的printf中它被隐式转换为int。 -
"代码仍然有效" - 这是未定义行为的一种可能结果,这就是您的程序所具有的。
-
你尝试这个有什么特别的原因吗?通常,
square函数将接受int并返回int,或者接受double并返回double。您是否只是想了解 void 指针?一个更现实的例子可能更有启发性。
标签: c void-pointers