c - 函数指针声明语法困惑

标签 c pointers syntax function-pointers

<分区>

我已经阅读并搜索了有关解码函数指针的左右规则。

例如:

int (*(*fun_one)(char *,double))[9][20];

是:fun_one 是指向期望函数 (char *,double) 和 返回指向 int 数组(大小 20)的数组(大小 9)的指针。

那是什么

const char code[] = "\x31\xc0";

int main(){
     ((void(*)( ))code)();
}

代码是 ?? 返回一个指向返回 void 的函数的指针...????? 外面的 () 之后呢

我对这个一头雾水。

最佳答案

const char code[] = "\x31\xc0";

int main(){
     ((void(*)( ))code)();
}

这是它的工作原理。 code 变量将衰减到第一个元素的地址 (\x31)。

然后该地址将被强制转换为接受不确定参数且不返回任何内容的函数的地址。

这涵盖了整个 ((void(*)( ))code) 位,到此为止,您基本上已经构造了一个指向您的字符串的函数指针。

() 然后简单地调用您指向的函数。

如果您的目标是 Intel CPU,31 c0 反汇编为 xor eax, eax 但当它运行到缓冲区,它很可能会崩溃。标记字符串结尾的 \x00add 指令的第一位,但对于后面的内容,我们无法保证。

ret 指令添加到字符串的末尾可能 使其更安全,但您可能必须检查生成的汇编代码以找出调用本身应该使用哪个 ret

关于c - 函数指针声明语法困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33624012/

相关文章:

c - 如何在 C 中获取 0's of digits when iterating through int'

syntax - Visual Studio Code - 语法高亮颜色的含义

c++ - 在这行代码 “int **v = new int*[n]; ”中如何分配内存?

java - 有人可以解释一下这个函数(我不小心写了 ("Any"关键字)吗?

c - 在 C 中使用 fwrite 将存储在结构中的整数写入 .txt 文件,但是当我打开 .txt 文件时数字显示为框

c - 从窗口中删除按钮

c - 比较两个相同长度的 int 数组的最佳方法?

c - C 中常量指针的类型转换

c++ - 从模板函数中取消引用的迭代器推断类型

c - 将 "adress"作为函数参数传递 - Python 3