2015-04-20 2 views
0

У меня есть два неподписанных массивы символов одного и того же размера и, если заявление, которое проверяет, чтобы увидеть, если они равны:Memcmp, кажется, дает мне неправильное возвращаемое значение

#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) 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 одним изменением?

+0

Почему 'offset' отличается от' BUFFER_SIZE'? – ouah

+0

Значение 'offset' предназначено для изменения, но в этом случае' BUFFER_SIZE' и 'offset' имеют эквивалентное значение 10000. – Sky

+2

Каково значение' offset'? Какова ценность 'BUFFER_SIZE'? – PaulMcKenzie

ответ

4

Хорошо ... Чтение вашей свалки, могу вам сказать, что origChar и otherChar оба являются '\0'*9999; в то время как вы пытаетесь сравнить первые 10000 байт при использовании смещения. Так что, вероятно, разница в 10000-м байте.

Используя offset-1, вы сравниваете первые 9999 байт, следовательно, это равенство.

«Ошибка», таким образом, происходит от того, что вы делаете в своем первом «. . .», который изменяет 10000-е значение.

+0

Да, кажется, вы совершенно правы. Я сделал 'p otherChar [9999]' и 'p origChar' и получил совершенно разные результаты. Я просто подумал, что они равны из-за того, что мне сказал GDB. – Sky

Смежные вопросы