此代码中发生了什么? 我没有得到这个代码。看起来它正在执行某种类型的转换或使用函数指针,但我不确定。如果有人能帮助我,我将不胜感激。感谢。
const char string[]="Hello!";
int main()
{
(*(void (*)()) string)(); //Obviously, my problem is this line :)
return 0;
}
答案 0 :(得分:4)
首先,让我们用cdecl来解释内心的胡言乱语:
$ cdecl
cdecl> explain (void (*)())
cast unknown_name into pointer to function returning void
所以(void (*)()) string
将string
强制转换为函数指针。然后取消引用函数指针以调用底层函数。该行等同于
void (*fp)() = (*(void (*)()) string)();
(*fp)();
这(在大多数机器上)尝试执行“Hello!”作为机器代码。它可能会在具有虚拟内存的计算机上彻底崩溃,因为数据通常标记为不可执行。如果它没有崩溃,它就不可能做任何连贯的事情。无论如何,这不是有用的代码。
这里唯一要学习的是cdecl
工具可以用于理解或编写复杂的C类型和声明。
答案 1 :(得分:3)
void (*)()
是函数指针类型。 (void (*)()) string
将string
强制转换为此类函数指针。表达式中剩余的(* ...)()
取消引用此结果函数指针并尝试调用该函数。
由于没有指针指向的任何函数,只有字符串“Hello!”,因此不会产生任何有用的结果。