c - 测试元素是否为数组 c

标签 c arrays multidimensional-array detection

我如何检测一个元素是否是一个数组?另外,我将如何声明这样的数组:[1, 2, 3, [4, 5, 6]]

最佳答案

你不知道。

在 C 中,多维数组是数组的数组,而不是一个元素是另一个数组而其他元素是数字的数组。 int x[10][10]x 声明为由 10 个 10 个 int 组成的数组,即 10 x 中的总共 100 个元素10矩阵。

要执行您描述的操作,您需要一组 void *:

struct myarr {
  size_t len;
  void **arr;
};

您使用 x.arr = malloc(x.len * sizeof(void *))arr 分配 len 元素。然后每个元素可以是任何你想要的 - 也许是一个数字,也许是另一个用于进一步嵌套的 struct myarr

但是实际上,您无法知道 void * 是数字还是另一个数组。因此,您需要某种动态类型检查。

enum mytype {
  INT,
  ARR,
};

然后你创建一个 struct myint 并重做 struct myarr 以兼容:

struct myint {
  enum mytype type;
  int i;
};

struct myarr {
  enum mytype type;
  size_t len;
  enum mytype **arr;
};

当你制作一个struct myint时,总是设置x.type = INT,而当你制作一个struct myarr时,总是设置x.type = ARR.

struct 指针总是可以转换为指向第一个元素的指针,因此 struct myint *struct myarr * 都可以转换到 enum mytype * 指针,这是您在 myarr 中的数组所持有的内容。然后,当您使用 .arr[n] 访问数组的元素时,您可以(在运行时)测试它持有什么类型,相应地转换指针,并随意使用:

for(size_t i = 0; i < x.len, i++)
  {
    enum mytype *j = x.arr[i];
    if(*j == INT)
      {
        printf("%i", ((struct myint *)j)->i);
      }
    else if(*j == ARR)
      {
        printf("[");
        // recurse
        printf("]");
      }
    else /* this should not happen, you messed up */;
  }

有多种其他方法可以从根本上实现相同的目标。

关于c - 测试元素是否为数组 c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5774712/

相关文章:

javascript - 如何根据 Vanilla javascript中的属性对对象数组进行分组

arrays - Typescript - 对通用数组进行排序

java - 如何调用带有数组参数的方法

java - 如何检查二维数组是否为空

在 linux (htop) 上更改线程名称

c - 指向 C 中结构混淆的指针

c - 如何从文件中读取字符串并将其标记为数组?

c - 在 C 中使用宏将项目附加到数组

php - 比较 2 个数组的差异,其中某些值重复

C-将矩阵传递给没有非常量列值的函数