指针声明和函数调用中的奇怪 C 语法

Odd C syntax in pointer declaration and function call

在有人推荐cdecl工具之前,我已经试过了。奇怪的是,大多数查询的语句都返回语法错误警告。

下面是我在网上找到的一个 C 程序,它只做 运行 一段 shellcode。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {

char shellcode[] = "\xb0\x01\x31\xdb\xcd\x80";     

int (*func)();

func = (int (*)()) shellcode;
(int)(*func)();

return 0;

}

程序按预期运行,但 C 语法是我见过的最奇怪的语法之一。我会尽力解释它们。

int (*func)();

此语句将 func 声明为指向函数(由“()”表示)的指针(由“*”表示)returns 一个 int。

func = (int (*)()) shellcode;

此语句将 shellcode 数组类型转换为一个指针(由 '(*)' 表示)指向函数(由 '()' 表示)returns 一个 int 并将指针分配给 func。

(int)(*func)();

最后一条语句执行指针 func(由“(*func)”指示)指向的函数(由“()”指示)并将结果类型转换为整数。

认为这就是这里发生的事情。如果对 C 更有经验的人发现我的解释有任何错误,或者可以提供替代或更具教育意义的解释,我非常欢迎您的意见。

我从来没有写过这样的变量初始化或函数调用,所以我对显示的语法仍然有些困惑。如果您有更易读的方式来编写上面的代码,也请提供输入。

谢谢。

完全正确,虽然我不明白为什么它会将 return 值转换为 int;我怀疑即使是写这篇文章的人也对 C 函数指针语法没有那么自信。

在现实世界中,您可能会看到使用 typedef 编写的代码:

typedef (*funcT)();
funcT func = (funcT) shellcode;
(*func)();