memcmp返回值的大小是什么意思?

时间:2014-05-12 20:33:43

标签: c memcmp

我刚刚调试了一个令人难以置信的令人讨厌的错误:在我自己的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已经返回-101而另一个又返回了-505。通过将此与direction进行比较,我导致排序完全错误。

但我想知道,memcmp的返回值的绝对值(即大小)实际上是什么意思?

来自www.cplusplus.com

  

返回一个表示其间关系的整数值   内存块的内容:零值表示内容   两个内存块都相等。值大于零表示   两个内存块中不匹配的第一个字节有一个   ptr1中的值大于ptr2中的值,就好像被评估为unsigned char一样   值;值小于零表示相反。

没有提及尺寸,他们只是通过说大于零来确保+ -1的错误。

2 个答案:

答案 0 :(得分:5)

documentation说:

  

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来实现,并且返回值将是不同的。