我刚刚调试了一个令人难以置信的令人讨厌的错误:在我自己的PC上(Windows 7 x64,MinGw),我的C程序在比较数组成员时会使用memcmp
成功对数组进行排序。
我的功能使用了冒泡排序算法,它的骨架看起来像这样:
void array_sort(ArrayMap *array, char direction) {
make sure direction is +1 or -1 only
define some variables
for(...) {
for(...) {
cmpres = memcmp(elm1, elm2, sizeOfElement);
if (cmpres!=0&&cmpres!=direction)
{
SWAP here
}
}
}
现在,在我的电脑上,memcmp
已经返回-1
,0
和1
而另一个又返回了-5
,0
和5
。通过将此与direction
进行比较,我导致排序完全错误。
但我想知道,memcmp
的返回值的绝对值(即大小)实际上是什么意思?
返回一个表示其间关系的整数值 内存块的内容:零值表示内容 两个内存块都相等。值大于零表示 两个内存块中不匹配的第一个字节有一个 ptr1中的值大于ptr2中的值,就好像被评估为unsigned char一样 值;值小于零表示相反。
没有提及尺寸,他们只是通过说大于零来确保+ -1的错误。
答案 0 :(得分:5)
memcmp()函数应返回一个大于,等于的整数, 或者小于0,如果s1指向的对象大于,则等于 分别来自或小于s2指向的对象。
它并没有说它会返回-1或1.它究竟返回的是依赖于实现的。
<强>更新强>
实现比较功能时,通常会写:
return a[i] - b[i];
而不是:
if (a[i] > b[i])
return 1;
else
return -1;
这是一个可能的实现,解释了返回的数字。
答案 1 :(得分:3)
特定于结果量级的实现,因此它没有可移植的含义,您不应该依赖它。 memcmp()
函数仅保证返回正值,负值或零值。
允许它具有任何值的原因是memcmp()
可以像这样定义:
// Types changed to "char" to simplify code.
int memcmp(const unsigned char *x, const unsigned char *y, size_t n)
{
for (size_t i = 0; i < n; i++) {
int diff = x[i] - y[i];
if (diff)
return diff;
}
但它也可以通过使用例如SSE来实现,并且返回值将是不同的。