2011-04-25 86 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陣列。