无法调用指向函数的指针返回指针

时间:2010-08-06 05:52:10

标签: c pointers function-pointers

我遇到了一个奇怪的问题。 我有两个文件a.c和b.c如下: b.c:

#include <stdlib.h>

int *foo() {
  int *x;
  x = (int *) malloc(sizeof(int));
  *x = 4;
  return x;
}

我使用gcc将b.c编译为b.so: $ gcc -o b.so -shared -fpic

交流转换器:

#include <stdio.h>
#include <dlfcn.h>

int main() {
  void *hdl;
  hdl = dlopen("./b.so", RTLD_LAZY);
  int *((*fn)(void));
  int *x;
  x = (*fn)();
  fn = dlsym(hdl, "foo");
  printf("%d", *x);
}

我使用gcc编译a.c:

$ gcc -fpic -ldl a.c

现在我跑的时候:

$ ./a.out 分段错误

我哪里出错? 当b.c中的函数没有返回指针时,这是有效的。

此外,我尝试使用dlerror()检查错误,但它没有报告。

4 个答案:

答案 0 :(得分:6)

通过检查,您在初始化之前使用fn。它还没有指向foo,它还没有特别指出任何东西,我怀疑结果行为是未定义的。

答案 1 :(得分:4)

您没有找到符号并调用该函数。

执行x = (*fn)();后,它不会从foo调用b.c函数。

您必须首先将符号加载到函数指针中。

  int *x;
  fn = dlsym(hdl, "foo");
  x = fn();
  printf("%d", *x);

上述情况应该有效。

编辑:

dlopen的示例程序,dlsym可以找到here,同时包含手册页信息。

答案 2 :(得分:3)

可能只是您示例的问题,但在您提供的代码中,您需要切换以下行:

 x = (*fn)();
fn = dlsym(hdl, "foo");

答案 3 :(得分:3)

这两行似乎顺序错误:

x = (*fn)();
fn = dlsym(hdl, "foo");