我有一个非常特殊的问题。我想初始化一个由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)。有什么建议吗?
答案 0 :(得分:9)
您有操作订单问题(以及额外的*
)。在第二个循环中尝试这个:
((int *)ptrVoid)[i] = 1;
答案 1 :(得分:2)
*(int*)ptrVoid[i]
为*((int*)(ptrVoid[i]))
,您解除引用次数过多([]
取消引用)。
撰写((int*)ptrVoid)[i]
(或更好,static_cast<int*>(ptrVoid)[i]
),然后重新考虑使用void*
。
答案 2 :(得分:1)
您只需要正确地加上括号并将void*
强制转换为int*
,以便编译器知道在使用[i]
对其进行索引时要偏移的字节数。
for(int i=0; i<ARRAY_SIZE;i++)
{
((int*)ptrVoid)[i] = 1;
}
答案 3 :(得分:0)
怎么样:
int* ptrVoidAsInt = new int[ARRAY_SIZE];
for(int i=0; i<ARRAY_SIZE;i++)
{
ptrVoidAsInt[i] = 1;
}
void* ptrVoid = ptrVoidAsInt;
但是,人们不得不想知道void数组或1
初始化数据的含义是什么。这真的是一个int或其他类型的数组,它将作为void *传递,然后重新返回到一个类型化的数组吗?