Как ссылаться на массив вложенных указателей на функции в C? - PullRequest
0 голосов
/ 12 апреля 2020

У меня по сути это:

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](); дает ошибку сегментации.

1 Ответ

0 голосов
/ 12 апреля 2020

Кажется, вы пытаетесь создать массив указателей на функции. Код может выглядеть следующим образом (частичный код):

ExampleFn *a;

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

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

В стандарте C тип void * предназначен только для указателей на тип объекта, а не для указателей на функцию.

Вы можете создать двумерный или трехмерный зубчатый массив таким же образом, как и для типов объектов (например, см. Здесь ), просто используйте ExampleFn вместо int, как в этом примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...