我有一个指向固定大小整数元素数组的指针。填充该数组后,我将其分配给void * pBuff。稍后,我需要通过void指针访问数组元素,但我没有这样做。
以下是使用C:
的代码void * pBuff = NULL;
int
set_data(void *pBuff)
{
int ptr = 10, i;
int phy_bn[8] = {0};
int (*pPB)[8];
for(i=0; i<8; i++){
phy_bn[i] = ptr;
}
pPB = &phy_bn;
pBuff = pPB;
return 0;
}
int main()
{
int i;
set_data(&pBuff);
for(i =0 ; i <8; i++){
printf("\ndata : %d\n", *(int *)pBuff[i]);
}
return 0;
}
它会针对*(int *)pBuff [i]提示错误将'void'术语转换为非''''。
任何帮助都将非常感激。
谢谢,
萨姆
答案 0 :(得分:3)
除了你需要使用:
((int*)pBuff)[i]
您的代码中包含未定义的行为。
pBuff = pPB;
pBuff
指向函数本地的数组,其生命周期不存在于函数范围之外。所以你有一个指针指向一些不需要存在但有时可能看似存在的东西。
答案 1 :(得分:2)
您可能应该同时取消引用*
或[]
,而不是: - )
如果您的目的是获取指向i
s的void指针的int
位置的整数,请使用:
((int*)pBuff)[i]
((int*)pBuff)
将pBuff
转换为指向整数的指针,然后[i]
抓取该位置的i
'整数。
所以你的循环将是:
for (i = 0 ; i < 8; i++)
printf ("\ndata : %d\n", ((int*)pBuff)[i]);
你应该注意的另一件事是返回指向基于堆栈的变量的指针。当函数退出时,那些变量消失,此时取消引用它们的指针是未定义的行为。
答案 2 :(得分:1)
pBuff[i]
是非法的,因为pBuff
是void*
。这是运营商优先的问题:
((int *)pBuff)[i]
您不需要使用第一个pBuff
再取消引用*
,因为[i]
已经这样做了。
答案 3 :(得分:0)
应该是
void * pBuff = NULL;
int
set_data(void *pBuff)
{
int ptr = 10, i;
int *phy_bn = (int*)malloc(sizeof(int)*8);
//this is needed so that it is valid for pBuff to point phy_bn even if it is getting out of scope
for(i=0; i<8; i++){
phy_bn[i] = ptr;
}
pBuff = phy_bn;
return 0;
}
int main()
{
int i;
set_data(&pBuff);
for(i =0 ; i <8; i++){
printf("\ndata : %d\n", ((int*)pBuff)[i]);
}
return 0;
}