【问题标题】:Function pointer assignement and typecast函数指针赋值和类型转换
【发布时间】:2022-08-19 16:25:28
【问题描述】:

我想测试一下我对函数指针的想法。我写了一个测试,但它不起作用(导致Segmentation fault)。这是我的简化测试:

#include<stdlib.h>
void a(){}
void b(){}
int main(){
    size_t s=0;
    char* p1=(char*)&a;
    char* p2=(char*)&b;
    while(*p1++==*p2++) s++;
    void (*o)();
    char* c=malloc(s);
    while(s--) *(c+s)=*((char*)&a+s);
    o=(void(*)())c;
    o();
    return 0;
}

代码应该复制一个空函数的机器代码(这里如果在两个空函数的地址处找到数据的交集并复制它)并运行复制。

感谢您伸出援手。

  • \"测试我的想法\"。什么想法?该代码应该做什么?
  • 对不起。我首先将其包含在问题中,然后将其删除。它应该复制机器代码(在这种情况下可能只是 RET)并运行它。
  • edit 使用任何对理解问题至关重要的信息更新该帖子。
  • 你至少应该做一些合理性检查。例如,是s &gt; 0?为什么你认为你可以运行分配在数据内存中的任意机器代码?您听说过现代保护计划吗?
  • 您想将代码从函数复制到您在堆上分配的内存中。您不应该期望该内存范围是可执行的。我会假设任何最近的操作系统都不允许从这样的内存区域执行代码。

标签: c casting function-pointers


【解决方案1】:

不要试图智取编译器。这是你的朋友。

void a() { puts( "Hello from a" ); }

void b() { puts( "Hello from b" ); }

int main() {

    void (*o)();

    o = a;
    o();

    o = b;
    o();

    return 0;
}

输出:

Hello from a
Hello from b

【讨论】:

  • 谢谢,但为什么我的代码会导致Segmentation fault
  • @markoj您尝试获取两个不同函数的地址(这将是不同的),然后malloc() 与两个地址匹配的字节数相同(这将小于指针的大小....之后,您得到未定义的行为!!! Da-da-da-dumb ...
猜你喜欢
  • 2017-10-12
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2019-06-16
相关资源
最近更新 更多