【问题标题】:checking the elements of a struct through a void pointer in C通过 C 中的 void 指针检查结构的元素
【发布时间】:2014-03-17 22:41:11
【问题描述】:

我有一个关于迷宫求解算法的作业,我使用路径树来解决它,这些是我的结构:

typedef struct node* nodePtr;
typedef struct root{
    int coordX;
    int coordY;
    nodePtr child[4];
} root;

typedef struct node{
    int coordX;
    int coordY;
    char val;
    nodePtr child[3];
    void* parent;
} node;

父指针既可以是指向根的指针,也可以是指向节点的指针,以便在树中没有循环。我在分配节点时检查了这个东西:

void assignNode(nodePtr *nodeAddr, int x, int y, char **maze, void *parent){
...some codes...
if(y != parent->coordY && x != parent->coordX)

这是我得到恼人的错误的地方

dereferencing 'void *' pointer
error: request for member 'coordY' in something not struct or union
error: request for member 'coordX' in something not struct or union

【问题讨论】:

标签: c pointers struct void-pointers


【解决方案1】:

您不能像这样取消引用void*。它需要知道指针的类型(在您的情况下是node*root*)。所以,你需要typecast你的指针(node*root*)。在这种特殊情况下,作为节点。 即代替

if(y != parent->coordY && x != parent->coordX)

if(y != ((node*)parent)->coordY && x != ((node*)parent)->coordX)

但由于它是您的代码,正如您所提到的,它可能是任何一种指针(node*root*),您需要有一些方法来识别它,然后适当地进行类型转换。

【讨论】:

  • 我认为你的意思是“cast”或“typecast”而不是 typecase。请注意,如果 parent 为 Null,这将爆炸。
  • 但是父级也可以是指向根类型结构的指针,父级不会为空,因为我将它们填充到递归函数中编辑:错字
  • 已更正它,但这是 OP 想要做的。是的,他也必须处理那个案子..
  • 是的,没错,我只是强调了他为什么会收到错误以及如何避免它。至少他得到错误的情况。
  • @user3430912:是的,它可以是任何一种类型的指针,您需要有某种方式了解它,然后相应地取消引用您的指针。我更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2012-10-11
相关资源
最近更新 更多