我需要弄清楚如何将两个不同的结构传递给一个函数。我尝试使用void*作为参数,但我收到错误:
warning: dereferencing 'void *' pointer
error: request for member left in something not a structure or union
成员右侧出现相同错误
以下是我所做的一般操作(代码可能无法编译)。
struct A{
char *a;
struct A *left, *right;
} *rootA;
struct B{
char *b;
struct B *left, *right;
} *rootB;
void BinaryTree(void *root, void *s){
if(condition)
root->left=s;
else if(condition)
BinaryTree(root->left, s);
if(condition)
root->right=s;
else if(condition)
BinaryTree(root->right, s);
}
int main(){
// Assume the struct of nodeA and nodeB get malloc()
// as well as the variables a and b with actual data.
struct A nodeA;
struct B nodeB;
BinaryTree(rootA, nodeA);
BinaryTree(rootB, nodeB);
return 0
}
您对结构声明感到困惑。类型由结构后的单词给定。最后,至少在你了解typedefs之前,这件事还需要继续。示例:
struct A{
char *a;
struct A *left, *right;
};
当您调用BinaryTree时,您需要始终向它传递指针而不是结构。示例:
BinaryTree(&nodeA, &nodeA);
对void指针执行操作时,需要首先将其强制转换为正确的指针类型。示例:
(struct A*)root->left=s;
将这些结构作为空指针传递绝对是一种糟糕的做法,你会感到非常困惑。空指针应谨慎使用。由于您似乎是从C开始的,我建议您在更好地理解值和引用语义之前,不要使用它们。话虽如此,当我开始使用C时,我做了很多愚蠢的代码,有时仍然如此。你会通过时间和练习来解决的。
您的程序有两个方面需要重新查找。第一,是参数传递,您通过值而不是引用传递。因此,对BinaryTree
函数的调用应该具有
BinaryTree(rootA, &nodeA);
另一个主要考虑因素是如何在BinaryTree
函数中处理这些空指针。在当前形式中,
void BinaryTree(void *root, void *s){
if(condition)
root->left=s;
这里root
是void *
,因此root->left
不能被评估。因此,您需要将root
类型转换为像这样有意义的数据类型
struct A *hdl = (struct A*)(root);
hdl->left = s;
即使使用这种方法,一个更重要的考虑因素是,您对不同的结构使用相同的函数。因此,要知道何时将root
类型转换为A
与B
是很困难/很有挑战性的,因此,此策略需要重新思考。