Я написал следующий код C, чтобы сравнить две области памяти и проверить, если они идентичныПользовательские memcmp() из структуры с полукокса членом
#include <stdio.h>
struct s1 {
int a, b;
char c;
} s1;
int memcmpwannabe(void* value1, void *value2, int size1, int size2) {
if(size1 != size2)
return -1;
if(size1 == 0 || size2 == 0)
return -1;
//memcmp() wannabe
char *p1 = value1;
char *p2 = value2;
int sz = size1;
do {
if(*p1 != *p2)
break;
else
p1++, p2++;
}
while(--sz != 0);
if(sz == 0)
return 0;
return -1;
}
int main() {
struct s1 v1;
struct s1 v2;
v1.a = 1;
v1.b = 2;
v1.c = 'a';
v2.a = 1;
v2.b = 2;
v2.c = 'a';
int res = memcmpwannabe((void*) &v1, (void*) &v2, sizeof(s1), sizeof(s1));
printf("Res: %d\n", res);
}
структуры идентичны, но он вернется - 1 в любом случае. После некоторой отладки я обнаружил, что три байта заполнения после переменной char заполнены случайными данными, а не нулями, как я ожидал.
Зная это и тот факт, что я хочу сохранить его как можно более общим (так используя void * в качестве аргументов), может ли кто-нибудь указать мне на альтернативное сравнение байта с байтом?
(Перед тем как кто-то спрашивает, я пишу пользовательские memcmp(), потому что в некоторых реализациях it will continue after a difference
Там будет обивка после элемента с структурой. Содержащие (более или менее) случайные значения. Они могут сравнивать неравные с другими случайными байтами. – joop
Можете ли вы изменить элементы структуры, чтобы * включить * дополнение? Затем вы можете установить их на известное значение - то есть 0 или любую другую константу. – usr2564301
Почему вы считаете, что два диапазона длины 0 различны? – Deduplicator