对于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