【问题标题】:Memcmp seems to be giving me an incorrect return valueMemcmp 似乎给了我一个不正确的返回值
【发布时间】:2015-04-20 21:38:40
【问题描述】:

我有两个大小相同的 unsigned char 数组和一个 if 语句来检查它们是否相等:

    #define BUFFER_SIZE 10000

    unsigned char origChar[BUFFER_SIZE];
    unsigned char otherChar[BUFFER_SIZE];

    //Yes, I know this is unnecessary

    memset(origChar,'\0',BUFFER_SIZE);
    memset(otherChar,'\0',BUFFER_SIZE);

    . . .
    if(memcmp(origChar,otherChar,offset))
    {
        . . .
    }

当我检查 gdb 中的两个数组时,我得到以下信息:

(gdb) p origChar
$1 = '\000' <repeats 9999 times>
(gdb) p otherChar
$2 = '\000' <repeats 9999 times>...
(gdb) p memcmp(otherChar,origChar,offset)
$3 = 1

但是,如果我将 offset 减 1,我会得到以下结果:

(gdb) p memcmp(otherChar,origChar,offset-1)
$4 = 0
(gdb) p offset
$5 = 10000

这对我来说真的没有任何意义。 GDB 基本上说它们是完全相等的,那为什么将offset 减一会改变呢?

【问题讨论】:

  • 为什么offsetBUFFER_SIZE 不同?
  • offset 的值是要改变的,但在这种情况下,BUFFER_SIZEoffset 的值是 10000。
  • offset 的值是多少? BUFFER_SIZE 的值是多少?
  • @Sky 现在的问题是——你的程序真的做了什么?只是 gdb 的问题,还是您的程序实际上返回了错误的结果?
  • 这里没有问题:ideone.com/38MTc6

标签: c++ c memory gdb


【解决方案1】:

嗯...阅读您的转储,我可以告诉您 origCharotherChar 都是 '\0'*9999 ;当您尝试在使用偏移量时比较前 10000 个字节时。所以第10000个字节可能有差异。

使用offset-1,您将比较前 9999 个字节,因此是相等的。

因此,“错误”来自您在第一个“. . .”中所做的修改第 10000 个值的操作。

【讨论】:

  • 是的,看来您完全正确。我做了p otherChar[9999]p origChar 得到了完全不同的结果。因为 GDB 告诉我的,我刚刚认为他们是平等的。
猜你喜欢
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2014-11-30
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
相关资源
最近更新 更多