2015-07-01 40 views
1

我試圖做一個文件級或全局範圍的數組,其大小在運行時確定。像this one各種製品建議此圖案用於這種動態數組:當指針被聲明爲一個類型時,它如何解除引用'void *'?

static MISCTYPE *handles; 
static int nthreads; 

int main(int argc, char **argv) { 
    // nthreads set from from argv 
    handles = malloc(nthreads * sizeof(MISCTYPE)); 
    for(i = 0; i < nthreads; i++) { 
     handles[i] = miscfunction(); 
    ... 
    free(handles); 
    return 0; 
} 

int otherfunction(...) { 
    for(i = 0; i < nthreads; i++) { 
     handles[i] = miscfunction(); 
    ... 
} 

然而,無處不在我使用指針等的陣列(即handles[i])編譯器說warning: dereferencing ‘void *’ pointer然後error: invalid use of void expression

但它不是一個無效的指針!它肯定有一個類型(這種僞代碼中的MISCTYPE),並將其重新轉換爲相同類型不會阻止錯誤。我沒有通過它作爲void *或類似的東西。

這是怎麼回事?更重要的是,我能做些什麼呢?

+4

好吧,顯然'MISCTYPE'只是'void'的另一個名字。 MISCTYPE定義的方式和位置在哪裏? – AnT

+0

@Olaf:與C++不同?當涉及到typedef名稱的一般狀態時,我不知道C和C++之間有什麼區別。在C和C++中,typedef名稱只是現有類型的別名,而不是新類型。 – AnT

+0

啊哈!這就是我沒有挖掘到頭文件!果然,它被定義爲'typedef void MISCTYPE'。現在要弄清楚這是如何工作的... – ewall

回答

1

好了,下手,如果編譯器告訴你handles是一個void *,你應該相信它。現在,事實證明,malloc返回一個void *,從中我們推斷handles仍然是一個void *後分配。

由此我們可以推斷出該作業並未按照您的想法進行。在這一點上,我們必須問「什麼是MISCTYPE」,並且我們使用您發佈的代碼無法推斷出這一點。但是如果你對MISCTYPE是什麼,我敢打賭你會找到答案。

+1

@Charlie Martin:這是C.在C中'void *'可以自由地和隱式地轉換爲任何數據指針類型。 'malloc'返回'void *'的事實的確讓我們可以推出任何關於'handles'的東西。 – AnT

+0

@Olaf:我猜這是一個錯字;我修好了它。 –

+0

@AnT「......從中我們推斷出這個任務並不是在做你的想法。」無論MISCTYPE是什麼,分配的結果仍然是一個「void *」。 –

2

呀,一定是有什麼嬉戲的MISCTYPE,因爲下面的例子中正常工作:

#include <stdio.h> 
#include <stdlib.h> 

static int *handles; 

int main(int argc, char **argv) 
{ 

    int i = 0; 
    handles = malloc(20 * sizeof(int)); 
    for(i = 0; i < 20; i++) { 
     handles[i] = i; 
    } 

    free(handles); 
    return 0; 
} 
相關問題