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

Tom*_*ica 1 c memcmp

我刚刚调试了一个令人难以置信的令人讨厌的错误:在我自己的PC(Windows 7 x64,MinGw)上,我的C程序将使用memcmpwhen比较数组成员成功对数组进行排序.

我的函数使用冒泡排序算法,它的骨架看起来像这样:

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
             }
         }
}
Run Code Online (Sandbox Code Playgroud)

现在,在我的电脑上,memcmp已经返回-1,01在另一个电脑上,它又返回了-5,0并且5.通过与direction我的比较,导致排序完全错误.

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

来自www.cplusplus.com:

返回表示存储块内容之间关系的整数值:零值表示两个存储块的内容相等.的值大于零表示不在两个存储器块匹配的第一个字节在PTR1比PTR2更大的值,如同评价为无符号字符值; 小于零的值表示相反.

没有提到大小,他们只是通过大于零来确保+ -1的错误.

Die*_*Epp 5

结果幅度特定于实现,因此它没有可移植的意义,您不应依赖它。该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;
}
Run Code Online (Sandbox Code Playgroud)

但也可以使用例如SSE来实现,并且返回值会有所不同。


Cod*_*odo 5

文件说:

如果s1指向的对象分别大于,等于或小于s2指向的对象,则memcmp()函数将返回大于,等于或小于0的整数.

它并没有说它将返回-1或1.它确切返回的是依赖于实现的.

更新:

在实现比较功能时,您经常会写:

return a[i] - b[i];
Run Code Online (Sandbox Code Playgroud)

代替:

if (a[i] > b[i])
    return 1;
else
    return -1;
Run Code Online (Sandbox Code Playgroud)

这是一个可能的实现,解释了返回的数字.