2011-04-25 92 views

回答

3

你不知道。

在C中,多维数组是数组的数组,而不是数组,其中一个元素是另一个数组,但其他数组是数字。 int x[10][10]x声明为10个10个阵列的阵列,即10×10个矩阵中的100个全部元素。

做你的描述,你需要的void *秒的数组:

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

您分配了arrlen元素与x.arr = malloc(x.len * sizeof(void *))。然后每个元素可以是任何你想要的 - 可能是一个数字,也许是另一个嵌套的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 */; 
    } 

还有其他各种方式实现根本一样的东西。

2

C中的数组绝对不能这么做 - 它们不能容纳并非所有类型的对象集合。 C++标准库中的集合类也是如此。要创建这种“异构”集合,实际上需要定义某种结构(或C++中的类) - 例如称为DataObject - 然后安排DataObject能够表示不同的类型,通常使用union。然后阵列中的所有东西都可以是DataObject,但其中一些可以是DataObject,其中包含int,其他可以包含另一个DataObject阵列。