【问题标题】:What does size of the memcmp return value mean?memcmp 返回值的大小是什么意思?
【发布时间】:2014-06-30 08:44:41
【问题描述】:

我刚刚调试了一个令人难以置信的严重错误:在我自己的 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
             }
         }
}

现在,在我的 PC 上,memcmp 已返回 -1、0 和 1,在另一个上它返回 -5、0 和 5。通过将此与 direction 进行比较,我导致排序完全错误。

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

来自www.cplusplus.com:

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

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

【问题讨论】:

    标签: c memcmp


    【解决方案1】:

    documentation 说:

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

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

    更新:

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

    return a[i] - b[i];
    

    代替:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      猜你喜欢
      • 2013-04-25
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多