【发布时间】:2021-05-09 10:57:21
【问题描述】:
我不知道如何查找它,即使标题令人困惑,即使我对我要查找的内容也感到困惑,而且这个问题肯定已经被问过,但它是如此具体,所以这里有一点上下文:
int comparison(const int* a, const int* b) {
return *a - *b;
}
int main(int argc, char const *argv[])
{
int arr[3] = {1,6,-2};
qsort(arr,3,sizeof(int),comparison);
return 0;
}
好吧,它确实有效,但是编译器给了我一个警告,因为 qsort 想要一个类型的函数:
int(*)(const void*, const void*)
比较是类型的函数:
int(*)(const int*, const int*)
我想知道为什么编译器不满意,因为它只需要转换地址。甚至应该很高兴为 void* 指针提供类型。这真的很糟糕吗?像未定义的行为或什么?还是只是编译器在抱怨什么?
【问题讨论】:
-
如果您通过与实际函数类型不同的指针调用函数,则这是未定义的行为。因此,传递
qsort()期望的函数类型至关重要,因为它将假定它期望的类型,如果实际函数具有不同的类型,您将得到 UB。