我无法为将队列管理为链接列表的队列的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或我尝试过的各种替代方案。
感谢任何帮助。
答案 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;