2011-03-23 99 views
0

我有一個相當奇怪的問題。我想初始化一個由void指針指向的數組,使用new分配內存,如下所示。現在動態數組和空指針

const int ARRAY_SIZE = 10; 
void InitArray() 
{ 
    int *ptrInt = new int[ARRAY_SIZE]; 
    for(int i=0; i<ARRAY_SIZE;i++) 
    { 
     ptrInt[i] = 1; //OK 
    } 

    void *ptrVoid = new int[ARRAY_SIZE]; 
    for(int i=0; i<ARRAY_SIZE;i++) 
    { 
     *(int*)ptrVoid[i] = 1; //Culprit : I get a compiler error here 
           //(error C2036: 'void *' : unknown size) 
    } 
} 

,我要初始化這個數組是由ptrVoid尖說1.如何去了解它的要素是什麼?有了這段代碼,我得到了一個編譯器錯誤,如代碼中所示(我正在使用VS 2010)。有什麼建議麼?

+2

不使用'void *'。 – 2011-03-23 01:09:04

+0

不要使用'new []'。使用'std :: vector'。 – GManNickG 2011-03-23 06:01:11

+0

爲什麼在表達式中一次全部完成?給自己一個新的intptr,併爲其分配你的voidptr的值。對於最隱蔽的代碼沒有額外的要點! – 2011-03-23 17:58:47

回答

9

您有一個操作順序問題(和一個額外的*)。試試這個你的第二個循環中:

((int *)ptrVoid)[i] = 1; 
+0

@Chris--是的。 '[]'數組索引操作符首先出現 - 這是錯誤來自的地方。他有一個額外的解除引用的事實也是一個錯誤,但不是導致編譯器消息的那個錯誤。 – 2011-03-23 00:53:59

+0

Downvote?小心解釋爲什麼? – 2011-03-23 00:57:51

+3

+1反擊驅動器downvoter孩子。 – 2011-03-23 01:08:22

1

你只需要正確地加上括號,並投了void*int*,讓編譯器知道多少字節與[i]抵消,當你索引它。

for(int i=0; i<ARRAY_SIZE;i++) 
{ 
    ((int*)ptrVoid)[i] = 1; 
} 
2

*(int*)ptrVoid[i]*((int*)(ptrVoid[i])),而你解引用次數太多(在[]做了間接引用)。

((int*)ptrVoid)[i](或更好,static_cast<int*>(ptrVoid)[i]),然後根本重新考慮您的使用void*

+0

我希望我可以避免使用void指針,但它的使用是必要的,因爲我不知道使用該指針將存儲哪種類型的數據,我不想使用模板,因爲它會降低速度。我在一個非常低級的函數中使用它,這個函數被稱爲數十億次從文件中讀取數據。 – 2011-03-23 14:13:54

+0

@ user672160:模板不影響執行速度。它們是編譯時構造*僅*。而且,速度不能減慢或加快:物體的速度可以減小或增加,使物體分別減速或加速。 – 2011-03-23 14:17:46

0

如何:

int* ptrVoidAsInt = new int[ARRAY_SIZE]; 
for(int i=0; i<ARRAY_SIZE;i++) 
{ 
    ptrVoidAsInt[i] = 1;        
} 
void* ptrVoid = ptrVoidAsInt; 

但是,人們想知道無論是空數組或1初始化數據的含義是什麼。這真的是一個int或一些其他類型的數組,將被作爲一個void *傳遞,然後重新回到一個類型數組?