相关疑难解决方法(0)

如何正确地将dlsym返回的指针分配给函数指针类型的变量?

我试图使用dlopen()dlsym()在我的代码,并编译它gcc.

这是第一个文件.

/* main.c */

#include <dlfcn.h>

int main()
{
    void *handle = dlopen("./foo.so", RTLD_NOW);

    if (handle) {
        void (*func)() = dlsym(handle, "func");
        func();
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是第二个文件.

/* foo.c */

#include <stdio.h>

void func()
{
    printf("hello, world\n");
}
Run Code Online (Sandbox Code Playgroud)

这是我编译和运行代码的方法.

$ gcc -std=c99 -pedantic -Wall -Wextra -shared -fPIC -o foo.so foo.c
$ gcc -std=c99 -pedantic -Wall -Wextra -ldl -o main main.c
main.c: In function ‘main’:
main.c:10:26: warning: ISO C forbids initialization between function …
Run Code Online (Sandbox Code Playgroud)

c pointers dlopen dlsym

20
推荐指数
3
解决办法
5370
查看次数

将函数指针转换为 uintptr_t / intptr_t 无效吗?

Microsoft 对 C 和 C++ 的扩展

要执行相同的转换并保持 ANSI 兼容性,您可以在将函数指针转换uintptr_t为数据指针之前将其转换为 a:

int ( * pfunc ) ();
int *pdata;
pdata = ( int * ) (uintptr_t) pfunc;
Run Code Online (Sandbox Code Playgroud)

C 的基本原理,修订版 5.10,2003 年 4 月:

即使使用显式强制转换,将函数指针转换为对象指针或 void 指针也是无效的,反之亦然

C11:

7.20.1.4 能够保存对象指针的整数类型

是否意味着pdata = ( int * ) (uintptr_t) pfunc;无效?

正如史蒂夫·萨米特所说

C 标准的编写假设指向不同对象类型的指针,尤其是指向函数而不是对象类型的指针,可能具有不同的表示形式

虽然pdata = ( int * ) pfunc;会导致UB,但似乎会pdata = ( int * ) (uintptr_t) pfunc;导致IB。这是因为“任何指针类型都可以转换为整数类型”和“整数可以转换为任何指针类型”并且uintptr_t …

c type-conversion visual-c++ language-lawyer c11

6
推荐指数
1
解决办法
1244
查看次数

返回void*的C++/C函数指针

我试图调用一个带参数的函数void(*)(void*, int, const char*),但我无法弄清楚如何将这些参数传递给函数.

例:

void ptr(int);
int function(int, int, void(*)(int));
Run Code Online (Sandbox Code Playgroud)

我试图像这样调用函数:

function(20, 20, ptr(20));
Run Code Online (Sandbox Code Playgroud)

这可能吗?

c c++ function-pointers

5
推荐指数
1
解决办法
5873
查看次数

如果余弦是一个fptr,如何解析*(void**)(&cosine)

找到这个代码示例

void *handle;
double (*cosine)(double);
handle = dlopen("libm.so", RTLD_LAZY);
*(void **) (&cosine) = dlsym(handle, "cos");
Run Code Online (Sandbox Code Playgroud)

我使用从右到左阅读规则来解析变量的类型:

double (*cosine)(double);
Run Code Online (Sandbox Code Playgroud)

在这里我从左到右书写但移动LTR:"余弦" - >"*" - >"是指针"然后"("我们走到最里面()范围 - >"(双)" - >"到函数取一个双" - >并返回最左边"双"

但这到底是什么意思?我甚至不知道从哪里开始解析)是"&cosine"的地址或参考?(void**)是什么意思?为什么它最左边的"*"?是取消引用还是类型?

*(void **) (&cosine)
Run Code Online (Sandbox Code Playgroud)

c c++ pointers function-pointers

2
推荐指数
2
解决办法
171
查看次数