如何将void指针取消引用回C中的原始结构?

时间:2011-08-01 22:31:23

标签: c xcode4 void-pointers

我无法为将队列管理为链接列表的队列的C接口提供struct值。它将数据保留为void指针,以允许接口一般地管理任何数据。我将值作为指针引用传入,然后将其保存为void指针。稍后当它返回时,我不知道如何将void指针强制转换回原始值。

我需要做什么?这是示例结构。

typedef struct MyData {
    int mNumber;
} MyData;

为了简化一切,我创建了一个虚拟函数,它可以模拟几行代码中的所有内容。

void * give_and_go(void *data) {
    void *tmp = data;
    return tmp;
}

您可以看到它接受一个void指针,将其设置为局部变量然后返回它。现在我需要恢复原来的价值。

MyData inVal;
inVal.mNumber = 100;
void * ptr = give_and_go(&inVal);
MyData outVal; // What converts ptr to the out value?

这是我被困的地方。我正在使用Xcode,它不允许我简单地将ptr转换为MyData或我尝试过的各种替代方案。

感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

您应该将void指针指定给MyData指针:

MyData *outVal = ptr;

如果您使用的是C ++,则无论如何都必须明确地使用它,因为它适用于两种语言:

MyData *outVal = (MyData *)ptr;

在任何一种情况下,您都可以使用->运算符来推荐:

outVal->mNumber

您也可以这样分配结构:

MyData outVal = *(MyData *)ptr;

但是这会复制结构,而其他形式会让你指向原始结构(即,分配给outVal->mNumber会改变inVal.mNumber,反之亦然)。单向或其他方式没有先验偏好。这取决于你的意图。

答案 1 :(得分:1)

将你的void *转换回MyData *,然后取消引用它。

MyData *outVal = (MyData*)(ptr);

答案 2 :(得分:0)

从我所知道的你提供的代码,你试图将void指针转换回非指针类型。这不起作用。

相反,将void指针强制转换回正确类型的指针

MyData inVal;
inVal.mNumber = 100;
void* ptr = give_and_go(& inVal);
MyData* outVal = (MyData*)ptr;