2017-10-10 132 views
1

我有一個使用malloc指針的模擬二維數組,我想獲取該數組的大小,因爲sizeof()返回指針的大小。 我的代碼(ANSI C):使用malloc獲取模擬數組的大小

void main(){ 
    int s1=10; 
    int s2=15; 
    int ** rack=(int**)malloc(s1*sizeof(int**)); 
    for(int i=0; i<s1; i++) rack[i]=(int*)malloc(s2*sizeof(int*)); 
} 

我想要的功能(可通過系統,可以自己做)這樣說:

size(rack) //returns 10 
size(rack[0]) //returns 15 

提前感謝! (欲瞭解更多信息,我使用GNU/Linux)

+2

請注意,[指向指針數組的指針並不是真正的2D數組](https://stackoverflow.com/q/42094465/694733)。另外,ANSI C引用C的舊版過時版本;如果你在Linux上,很可能你可以升級到C11。 – user694733

+3

一個好習慣就是不要在'malloc'中用'typeof'來處理'sizeof'的類型,但是指針應該指向'malloc(s1 * sizeof * rack)'的對象。同樣在C中,你不應該投下'malloc'和朋友的回報。 –

+1

您在malloc中分配了錯誤的空間量 –

回答

0

首先,你分配內存的方式是錯誤的。您需要將其更改爲:

void main(){ 
    int s1 = 10; 
    int s2 = 15; 
    int** rack = malloc(s1*sizeof(int*)); 
    if (rack == NULL) 
     return; 
    for(int i=0; i<s1; i++) { 
     rack[i]=malloc(s2*sizeof(int)); 
     if (rack[i] == NULL) 
      return; 
    } 

    ... 

    free(rack); 
    return; 
} 

記住,總是check malloc's result,也not to cast malloc's result

爲了讓您的數組的大小,你可以打印s1*s2*sizeof(int)已經分配您s1指針int,每個持有s2int秒。

+0

請注意,您*不*釋放您分配的所有內存。 –

+0

@Bob__我沒有,因爲我只回答了部分分配。我認爲OP釋放了他的記憶,但向我們展示了一小部分。 – Marievi

+0

由於'int'和'size_t'範圍的差異,'sizeof(int)* s1 * s2 *'不會導致s1 * s2 * sizeof(int)'溢出。 IAC,最好使用'size_t'作爲數組索引並且大小大於'int'。 – chux