也许是函数指针或转换问题。不确定

时间:2010-08-17 13:09:05

标签: c string

此代码中发生了什么? 我没有得到这个代码。看起来它正在执行某种类型的转换或使用函数指针,但我不确定。如果有人能帮助我,我将不胜感激。感谢。

const char string[]="Hello!";

int main()   
{

    (*(void (*)()) string)(); //Obviously, my problem is this line :)

    return 0;
}

2 个答案:

答案 0 :(得分:4)

首先,让我们用cdecl来解释内心的胡言乱语:

$ cdecl
cdecl> explain (void (*)())
cast unknown_name into pointer to function returning void

所以(void (*)()) stringstring强制转换为函数指针。然后取消引用函数指针以调用底层函数。该行等同于

void (*fp)() = (*(void (*)()) string)();
(*fp)();

这(在大多数机器上)尝试执行“Hello!”作为机器代码。它可能会在具有虚拟内存的计算机上彻底崩溃,因为数据通常标记为不可执行。如果它没有崩溃,它就不可能做任何连贯的事情。无论如何,这不是有用的代码。

这里唯一要学习的是cdecl工具可以用于理解或编写复杂的C类型和声明。

答案 1 :(得分:3)

void (*)()是函数指针类型。 (void (*)()) stringstring强制转换为此类函数指针。表达式中剩余的(* ...)()取消引用此结果函数指针并尝试调用该函数。

由于没有指针指向的任何函数,只有字符串“Hello!”,因此不会产生任何有用的结果。