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

时间:2015-02-23 05:51:37

标签: c function-pointers shellcode

在有人建议使用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声明为指向函数的指针(由'*'表示)(由'()'表示),返回一个int。

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

此语句将shellcode数组作为指针(由'(*)'表示)指定给函数(由'()'表示),该函数返回一个int并将指针指定给func。

(int)(*func)();

此最终语句执行指针func指向的函数(由'()'表示)(由'(* func)'表示)并将结果强制转换为整数。

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

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

谢谢。

1 个答案:

答案 0 :(得分:2)

这一切都是正确的,虽然我不知道为什么它将返回值强制转换为int;我的怀疑是,即使是那些写下来的人,对C函数指针语法也没有那么自信。

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

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