Ori*_*ski 6 c pointers casting function-pointers function
int foo(char *c) {...}
main() {
int (*thud)(void *);
thud = (int (*)(void *))(foo);
}
Run Code Online (Sandbox Code Playgroud)
在评估作业时实际发生了什么?
铸造类型和foo
; 之间存在差异; cast类型是一个指针,foo
是一个函数.那么,编译器是否将' (foo)
'中的内容转换为指针,foo
然后才进行转换?因为没有别的东西似乎有意义; 另一个选项是函数本身被转换为一个指向函数的指针,该函数获取void*
并返回一个int
,据我所知,函数是内存中一段代码的标签,因此不能成为指针,这是一个变量.
在C中,绝对没有.它只是编译胶水,以防止你做一些愚蠢的事情.在C中,调用者负责维护堆栈帧,因此在调用函数时需要强制转换(即参数和返回值被压入堆栈).这使得它安全(r),因为调用者的堆栈不可能不正确地变异.但是,在某些极少数情况下,调用的函数仍然可能会扰乱调用者的堆栈.
我应该澄清一下,赋值复制了函数指针.但在C语言中,所有函数指针都只是指针.类型和转换都是编译器粘合剂.
另一个澄清:标准指定(在6.5.2.2中)如果调用者使用不兼容的类型,则行为是未定义的.例如,将一个返回void的函数转换为一个返回int然后调用该函数的函数,"返回"值是没有意义的.在调用函数之前将函数转换为兼容类型是个好主意,否则您可能会看到意外的结果.