【问题标题】:How to have nested double pointers without structs in C?如何在C中没有结构的嵌套双指针?
【发布时间】:2020-07-24 07:58:11
【问题描述】:

这里我有以下代码:

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,其中可以包含任意嵌套元素。然后我想将init 中的a 也视为双空指针,因此它也可以包含任何内容。我打算简单地将它变成一个动态大小的整数数组。然后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

我对完成此任务的指针并没有非常扎实的把握,我想知道是否有人可以为我指明正确的方向。

【问题讨论】:

  • 澄清一下,在a[0] = (0); 行中,您是尝试将值零分配给a[0] 还是尝试将a[0] 设置为NULL
  • 为什么要在没有结构的情况下这样做?如果您的数组可以任意嵌套,您必须能够判断一个条目是整数还是另一个数组,不是吗?在 C 中执行此操作的规范方法是使用标记的联合。 (你可以对原始指针值做一些修改,但是...)
  • void 指针不能被取消引用,因为void 类型本质上是一种表示“无”的方式。 IIUC,你想要的是(((void**)&a))[*b+1] = value。这会说“a 是指向void* 的指针,我将其视为void* 的数组,我会将*b+1 指向的位置存储void* 值@987654337 @"。这就是你想要的吗?

标签: c arrays pointers void-pointers


【解决方案1】:

当您尝试引用 a:&a 时,您必须转换 void ** 而不是 void *,因为 a 一开始是一个指针。

所以,它会起作用(我不确定这是你想要的):

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

【讨论】:

  • 太棒了,谢谢!现在有什么方法可以通过将它分成几行并带有一些临时变量或其他东西来清理该行吗?这有点复杂。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2020-11-03
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多