Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这有什么意义:*(void**)(&;fptr)=dlsym(handle,";my_function";)`_C - Fatal编程技术网

这有什么意义:*(void**)(&;fptr)=dlsym(handle,";my_function";)`

这有什么意义:*(void**)(&;fptr)=dlsym(handle,";my_function";)`,c,C,代码来自此页面: 你能帮我理解吗? 它获取函数指针的地址,将其强制转换为void**并取消引用。我不知道为什么要这样工作 我感谢你的帮助!到目前为止,我得到的唯一建议是“从右向左读取”或类似“从右向左循环读取”之类的内容。该函数返回一个函数指针。这段代码说,嘿,拿我的函数指针变量,给我它的地址。将其强制转换为void**。现在遵从void**并将void*=的值设置为我从调用中获得的指针。代码的含义是: 取fptr的地址。此表达式的类型是指向函数指针的指针(某些特定类型) 将该指针表达式强制转换

代码来自此页面:

你能帮我理解吗? 它获取函数指针的地址,将其强制转换为void**并取消引用。我不知道为什么要这样工作


我感谢你的帮助!到目前为止,我得到的唯一建议是“从右向左读取”或类似“从右向左循环读取”之类的内容。该函数返回一个函数指针。这段代码说,嘿,拿我的函数指针变量,给我它的地址。将其强制转换为
void**
。现在遵从
void**
并将void*=的值设置为我从调用中获得的指针。

代码的含义是:

  • fptr
    的地址。此表达式的类型是指向函数指针的指针(某些特定类型)
  • 将该指针表达式强制转换为“指向void的指针”
  • 取消引用该指针以访问对象
    fptr
    ,就像它是
    void*
    类型的对象一样
  • 将右侧的结果分配给步骤3中获得的左值
  • 不幸的是,无论是谁在POSIX中编写了这个示例,都是非常糟糕的,因为步骤3违反了C语言的别名规则,因此调用了未定义的行为。特别是,真实世界的编译器将以破坏预期用途的方式优化此代码

    本例的作者试图实现的是避免将指针右侧从指针转换为void,再转换为指针到函数。这是基于C标准要求此强制转换生成警告的说法,但我已彻底搜索了此类要求,但找不到此类要求

    如果确实存在这样的问题(警告要求),那么在不调用未定义的行为(如POSIX文本中的坏例子)的情况下关闭警告的唯一方法是:

    void (*fptr)(); // or whatever function pointer type you want
    void *temp = dlsym(handle, "my_function");
    memcpy(&fptr, &temp, sizeof fptr);
    
    *(void**)(&fptr)=dlsym(句柄,“我的函数”)

    为了简化这一点

    fptr
    是一个指针

    &fptr
    是该指针的地址

    您正在将其键入指向空指针的
    指针


    然后引用并分配函数的返回值。

    我也无法理解它。我会使用
    fptr=(fptr_t)dlsym(…)
    ,其中
    fptr_t
    fptr
    @vhallac的实际类型:POSIX中备注/示例的作者声称,C标准要求您的强制转换生成警告。然而,我在C标准中找不到这样的要求。这就是他们用自己的方式写的原因,但请看我的答案,为什么他们的解决方案是无效的。@R。。我做到了(你的答案和他们的理由)。老实说,到目前为止,我还没有把这当作一个问题。谢谢你的回答。今天我学到了一些关于C的新知识。:)