【问题标题】:How to reference deeply nested function pointer array in C?如何在C中引用深度嵌套的函数指针数组?
【发布时间】:2020-07-24 17:17:24
【问题描述】:

我基本上有这个:

void **a;

typedef void (*ExampleFn)();

void
foo() {
  puts("hello");
}

void
init() {
  ExampleFn b[100] = {
    foo
  };

  a = malloc(sizeof(void) * 10000);

  a[0] = b;
}

int
main() {
  init();

  ExampleFn x = a[0][0];
  x();
}

但是在运行时我会遇到各种各样的错误,例如:

error: subscript of pointer to function type 'void ()'

如何让它工作?

执行((ExampleFn*)a[0])[0](); 之类的操作会导致分段错误。

【问题讨论】:

  • 将不是函数的东西分配给函数指针是无效的。做sizeof(void) 也是无效的。除此之外,你想要的是sizeof(void*)x = a[0]
  • 一个真正的大括号,但返回类型在单独的行上......从未见过
  • **a 不是指向 void 函数的指针,它只是一个 void。所以a[0] 的类型为void,而a[0][0] 试图取消引用一个空指针,这没有意义。然后它尝试为x 分配一个void 值,这是一个错误(它甚至意味着什么?)
  • a[0] = b; 在任何情况下都无法工作,因为b 是一个函数指针,而void * 只能存储对象指针
  • 我如何才能完成我理论上想要完成的事情,因为那时我还有很长的路要走?我从一个大型项目中删除了这个,所以它可能不是 100% 准确的。但它接近我想要做的。

标签: c pointers function-pointers void-pointers jump-table


【解决方案1】:

您似乎正在尝试创建一个函数指针数组。代码可能如下所示(部分代码):

ExampleFn *a;

void init()
{
    a = malloc(100 * sizeof *a);
    a[0] = foo;
}

int main()
{
    init();
    ExampleFn x = a[0];
    x();
}

在标准 C 中,void * 类型仅用于指向对象类型的指针,而不是指向函数的指针。

您可以像创建对象类型(例如 see here)一样创建 2-D 或 3-D 锯齿状数组,只需使用 ExampleFn 而不是该示例中的 int

【讨论】:

  • 有没有办法让嵌套函数指针?这就是我想要达到的目的。
  • @LancePollard 我不知道你所说的“嵌套函数指针”是什么意思
  • 所以我可以做a[0][0]() 或者如果它是void **a = malloc(); void **b = malloc(); void **c = malloc(); a[0] = b; b[0] = c; c[0] = arrayOfFunctions 等等。我该怎么做呢? a[0][0][0][0]().
  • @LancePollard 你似乎在描述一个 3-D 数组
  • @LancePollard 我添加了多维数组示例的链接
猜你喜欢
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2023-03-09
  • 2012-07-11
  • 1970-01-01
  • 2021-06-05
相关资源
最近更新 更多