Как вложенные двойные указатели без структур в C? - PullRequest
1 голос
/ 11 апреля 2020

Здесь у меня есть следующий код:

void **x;

void
push(void * value) {
  void *a = x[1];
  int *b = (int*)(&a[0]);
  printf("%d\n", *b);
  (((void*)&a))[*b + 1] = *value;
}

void
init() {
  void **a;
  void **b;

  a = malloc(sizeof(void*) * 100);
  b = malloc(sizeof(void*) * 100);
  x = malloc(sizeof(void*) * 10000);

  a[0] = (0);
  b[0] = (0);

  x[0] = a;
  x[1] = b;
}

int
main(int argc, char **argv) {
  init();
  push(argv);
  x[3] = "e";
  x[4] = "e";
  puts(x[4]);
}

По сути, моя цель - получить массив произвольного размера x, который может содержать произвольные вложенные элементы . Затем я хочу трактовать a в init как двойной указатель на пустоту, так что он тоже может иметь что угодно. Я планирую просто сделать его динамически изменяемым массивом целых чисел. Тогда b Я хочу содержать фиксированное количество произвольных элементов.

Однако я пробовал десятки комбинаций указателей и ссылок, и на данный момент я просто пробую и ошибаюсь. Получаем это на одной из последних конфигураций.

$ make test
test/test.c:19:25: error: incomplete type 'void' is not assignable
  (((void*)&a))[*b + 1] = *value;
  ~~~~~~~~~~~~~~~~~~~~~ ^
1 error generated.
make: *** [test] Error 1

У меня нет супер solid gr asp указателей для выполнения sh и я задаюсь вопросом, можно ли мне указать правильное направление.

1 Ответ

1 голос
/ 11 апреля 2020

Когда вы пытаетесь сослаться на: &a, вы должны разыграть void ** вместо void *, потому что a - это указатель вначале.

Итак, он будет работать (я Я не уверен, что это то, что вы хотите):

 (((void**)&a))[*b + 1] = value;

...