【发布时间】:2011-08-01 22:31:23
【问题描述】:
我无法为将队列作为链表管理的队列的 C 接口提供结构值。它以空指针的形式保存数据,以允许接口通用地管理任何数据。我将值作为指针引用传递,然后将其保存为 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 或我尝试过的各种替代方法。
感谢任何帮助。
【问题讨论】:
-
我发现我可以使用 MyData outVal1 = *(MyData *)ptr;以及 MyData *outVal2 = (MyData *)ptr;回到原始值来访问结构值。这是正确的做法吗?
-
转换回 (MyData *) 确实是这样做的方法。
-
请注意,如果您将
void*作为数据成员或函数参数,而没有任何随附的参数/成员,则表示您不在乎其中的内容。但是,如果您稍后将其投放,则必须小心。因此,您要么必须直接传递MyData*(并跳过void*的想法),要么提供一种方法让您的代码知道它需要转换为MyData*,例如传递enum说明您的类型,以及void*。让您的代码对其中的内容做出假设会导致棘手的错误,所以请考虑一下..
标签: c xcode4 void-pointers