我試圖做一個文件級或全局範圍的數組,其大小在運行時確定。像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 *
或類似的東西。
這是怎麼回事?更重要的是,我能做些什麼呢?
好吧,顯然'MISCTYPE'只是'void'的另一個名字。 MISCTYPE定義的方式和位置在哪裏? – AnT
@Olaf:與C++不同?當涉及到typedef名稱的一般狀態時,我不知道C和C++之間有什麼區別。在C和C++中,typedef名稱只是現有類型的別名,而不是新類型。 – AnT
啊哈!這就是我沒有挖掘到頭文件!果然,它被定義爲'typedef void MISCTYPE'。現在要弄清楚這是如何工作的... – ewall