1

我有一个指向固定大小整数元素数组的指针。填充该数组后,我将其分配给 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”术语错误转换为非“void” 。

任何帮助将不胜感激。

谢谢,

-山姆

4

4 回答 4

3

除了您需要使用的事实之外:

((int*)pBuff)[i]

您在代码中拥有的是Undefined Behavior

pBuff = pPB;

pBuff指向函数本地的数组,其生命周期不存在于函数范围之外。所以你有一个指针指向一些不需要存在但有时似乎存在的东西。

于 2012-11-15T06:25:26.173 回答
2

您可能应该取消引用*or []而不是同时使用 :-)

如果您的意图是在i指向ints 的 void 指针的该位置获取整数,请使用:

((int*)pBuff)[i]

((int*)pBuff)变成pBuff指向整数的指针,后面[i]的指针i在该位置获取第 ' 个整数。

所以你的循环是:

for (i = 0 ; i < 8; i++)
     printf ("\ndata : %d\n", ((int*)pBuff)[i]);

您可能应该注意的另一件事是返回指向基于堆栈的变量的指针。这些变量在函数退出时消失,此时取消引用指向它们的指针是未定义的行为。

于 2012-11-15T06:20:33.917 回答
1

pBuff[i]是非法的,因为pBuffvoid*. 这是运算符优先级的问题:

((int *)pBuff)[i]

您不需要pBuff再次取消引用第一个*,因为[i]已经这样做了。

于 2012-11-15T06:20:10.767 回答
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;
}
于 2012-11-15T06:24:02.827 回答