【问题标题】:Compare element inside a struct with a void pointer value in C将结构内的元素与 C 中的 void 指针值进行比较
【发布时间】:2015-05-02 02:07:28
【问题描述】:

我需要创建一个接收结构指针和空指针的函数,如果元素在结构上,则返回 1。

typedef struct {
    char *sx;
    int val, code, qtty;
    char abc [20];
} ST_DAT;

int compare (ST_DAT *, void *);

这是一个比较双链表中节点的程序的一部分,但是这个函数被用作:

int (*pfun)(ST_DAT *, void *));

问题是我不知道如何将void * 与其他值进行比较,直到我找到里面的值。

int compare (ST_DAT *stData, void *key)
{
    if (key == (*stData).val || key == (*stData).code || key == (*stData).qtty || strcmp (key,(*stData).abc) || strcmp (key,(*stData).sx) )
    {
       return 1;
    }else{
       return 0;
    }
 }

这是正确的吗?

【问题讨论】:

  • 应该如何调用compare
  • ... 甚至更具体:当调用 compare() 时,作为第二个参数传递的内容是什么?
  • ...如果你输入“我”,下次按这个f...f...有趣的转变...

标签: c pointers struct compare void


【解决方案1】:

您必须根据您要比较的数据对key 进行类型转换。在int的情况下,您必须确保比较指针的值而不是指针本身。

  if (*(int*)key) == (*stData).val || *(int *)key == (*stData).code || (int *)*key == (*stData).qtty || strcmp((char *)key,(*stData).abc) || strcmp ((char *)key,(*stData).sx) )

【讨论】:

  • 你去。抱歉粘贴源后离线。
  • 您的方法面临的问题与我在对 hacks 答案的评论中评论的问题相同。
【解决方案2】:

(*stData).val 属于int 类型,因此您需要将key 转换为int *,然后像这样取消引用它:

*(int *)key == (*stData).val

【讨论】:

  • 如果我想使用 -> 运算符,它会像:*(int *)key == stData->val 对吗?
  • 根据key 传递的内容,这样的代码将面临丑陋的对齐问题。例如,如果指针从未指向 int,则不应将 char 指针转换为 int 指针。
猜你喜欢
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 2020-11-19
  • 2021-02-02
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多