2

我只是碰巧调试了一个令人难以置信的讨厌的错误:在我自己的 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在另一台电脑上又返回-50并且5. 通过将此与direction我进行比较,导致排序完全错误。

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

www.cplusplus.com

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

没有提到大小,他们只是通过说大于零来确保 +-1 不会出错。

4

2 回答 2

7

文档说:

如果 s1 指向的对象分别大于、等于或小于 s2 指向的对象,则 memcmp() 函数应返回一个大于、等于或小于 0 的整数。

它并没有说它会返回 -1 或 1。它究竟返回什么取决于实现。

更新:

在实现比较函数时,你经常会这样写:

return a[i] - b[i];

代替:

if (a[i] > b[i])
    return 1;
else
    return -1;

这是解释返回的数字的一种可能实现。

于 2014-05-12T20:36:17.573 回答
4

结果幅度特定于实现,因此它没有可移植的意义,您不应该依赖它。该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来实现,返回值会有所不同。

于 2014-05-12T20:36:04.017 回答