将void *分配和解除引用到C中的数组指针

时间:2012-11-15 06:16:28

标签: c arrays pointers void-pointers

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

任何帮助都将非常感激。

谢谢,

萨姆

4 个答案:

答案 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]是非法的,因为pBuffvoid*。这是运营商优先的问题:

((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;
}