Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于struct,*.and->;_C_Pointers_Struct - Fatal编程技术网

对于struct,*.and->;

对于struct,*.and->;,c,pointers,struct,C,Pointers,Struct,这是错误的: return ((*(map *)a).key - (*(map *)b).key); 错误信息为: return ((map *)a->key) - ((map *)b->key); 我记得,在大多数情况下,->等于*和的值。出现问题是因为您在无效指针上使用了->运算符 首先需要重新键入它,然后使用取消引用运算符 正确: comparetest.c: In function ‘compare’: comparetest.c:32:18: warning: dere

这是错误的:

return ((*(map *)a).key - (*(map *)b).key);
错误信息为:

return ((map *)a->key) - ((map *)b->key);

我记得,在大多数情况下,
->
等于
*
的值。

出现问题是因为您在
无效指针上使用了
->
运算符 首先需要重新键入它,然后使用取消引用运算符

正确:

comparetest.c: In function ‘compare’:
comparetest.c:32:18: warning: dereferencing ‘void *’ pointer [enabled by default]
  return ((map *)a->key) - ((map *)b->key);
                  ^
comparetest.c:32:18: error: request for member ‘key’ in something not a structure or union
comparetest.c:32:36: warning: dereferencing ‘void *’ pointer [enabled by default]
  return ((map *)a->key) - ((map *)b->key);
                                    ^
comparetest.c:32:36: error: request for member ‘key’ in something not a structure or union

如果不确定,尝试一步一步的方法

您知道compare函数接收指向数组元素的
const
指针

数组元素的类型为
map
,因此函数接收
const map*
s

return (((map *)a)->key) - (((map *)b)->key);
void
-指针不能根据其性质取消引用,它们指向void

因此,将其值分配给正确键入的内容:

int compare(const void *pv1, const void *pv2)
{
  const map * pm1;
  const map * pm2;
然后像往常一样使用箭头操作符

  pm1 = pv1;
  pm2 = pv2;
上述内容可缩短为:

  return pm1->key - pm2->key;
}
这反过来又可以缩短为

int compare(const void *pv1, const void *pv2)
{
  const map * pm1 = pv1;
  const map * pm2 = pv2;

  return pm1->key - pm2->key;
}

这与
->
之间没有任何关系。代码
((map*)a->key)
是错误的,这仅仅是因为运算符的优先级。
->
运算符的优先级都高于强制转换运算符
()
。这意味着您的代码等同于

int compare(const void *pv1, const void *pv2)
{
  return ((const map *) pv1)->key - ((const map *) pv2)->key;
}
而不是

(map*) (a->key) // wrong
后者是你想要的


现在证明,表达式
(*(map*)a).key
完全等同于
((map*)a)->key
,但这不是问题的原因。

这是错误的,因为演员阵容与
a
没有关联。请您在顶部清楚地陈述您的问题,并简要说明您试图做什么?
(map*) (a->key) // wrong
((map*)a)->key // correct