[dlsym][(void**)]关于(void**)及其相关的详细理解
时间: 2023-11-14 18:03:06 浏览: 81
(void**)是一个指向指针的指针,也称为二级指针。在C语言中,指针是一种非常重要的数据类型,它存储了一个内存地址,可以通过该地址访问内存中的数据。而指向指针的指针则是指针的指针,即它存储的是指针的地址,通过两次间接引用,可以访问到指针所指向的内存。
在C语言中,dlsym函数是动态链接库中的一个函数,其作用是在动态链接库中查找指定的符号,并返回符号对应的地址。它的函数原型如下:
```
void *dlsym(void *handle, const char *symbol);
```
其中,handle是动态链接库的句柄,symbol是要查找的符号名称。由于dlsym返回的是一个void*类型的指针,如果要将其转换成其他类型的指针,可以使用(void**)进行类型转换。
总之,(void**)是指向指针的指针,用于间接引用指针所指向的内存。在dlsym函数中,使用(void**)进行类型转换,可以获取符号对应的地址,并将其转换成其他类型的指针。
相关问题
[dlsym][(void**)]关于(void**)及其相关的详细理解,请举例
(void**)是一个指向指针的指针类型,它可以用来存储一个指向任意类型指针的指针变量的地址。在C语言中,使用(void**)类型通常是为了在函数之间传递指向不同类型指针的指针。
一个常见的使用场景是在动态链接库中使用dlsym函数获取某个函数的地址。dlsym函数的原型是:
void* dlsym(void* handle, const char* symbol);
其中,void**类型的参数handle是一个指向动态链接库的句柄的指针。当调用dlopen函数打开一个动态链接库时,它会返回一个指向动态链接库的句柄的指针。这个句柄可以用来获取动态链接库中的函数地址,例如:
void* handle = dlopen("libtest.so", RTLD_LAZY);
void (*hello)() = dlsym(handle, "hello");
hello();
在上面的代码中,我们首先使用dlopen函数打开一个名为"libtest.so"的动态链接库,并将返回的句柄存储在handle变量中。然后,我们使用dlsym函数获取名为"hello"的函数的地址,并将其转换为一个函数指针hello。最后,我们调用hello函数。
注意,dlsym函数返回的是一个void*类型的指针,因此我们需要将其转换为正确的函数指针类型。在这个例子中,我们将其转换为void (*)()类型,表示一个没有参数并返回void的函数指针。
总之,(void**)类型的指针可以用来存储任意类型指针的指针变量的地址,通常用于在函数之间传递指针。在动态链接库中使用dlsym函数获取函数地址时,也可以使用(void**)类型的指针来存储动态链接库句柄的地址。
[dlsym][(void**)]关于(void**)及其相关的理解
(void**)是一个指向指针的指针,也就是说,它是一个指针数组的首地址。在C语言中,void*可以指向任何类型的指针,因此(void**)可以表示一个指向任何类型的指针数组的指针。在使用dlsym函数时,它返回一个void*类型的指针,该指针指向指定名称的符号地址。而使用(void**)作为参数,则表示将返回的指针强制转换为指向指针的指针,方便后续对返回指针进行解引用操作。因此,(void**)在dlsym函数中的使用,可以方便地获取指向函数或变量的指针,并进行后续操作。
阅读全文