2015-03-05 2 views
2

Я написал следующий код 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

+2

Там будет обивка после элемента с структурой. Содержащие (более или менее) случайные значения. Они могут сравнивать неравные с другими случайными байтами. – joop

+1

Можете ли вы изменить элементы структуры, чтобы * включить * дополнение? Затем вы можете установить их на известное значение - то есть 0 или любую другую константу. – usr2564301

+0

Почему вы считаете, что два диапазона длины 0 различны? – Deduplicator

ответ

3

Зная это и тот факт, что я хочу, чтобы сохранить его как родовое, как возможных (поэтому использование недействительным * в качестве аргументов)

Если вы только void * указателей, по определению, вы ничего не знаете о внутренних организациях объектов. а это значит, вы ничего не знаете о значении байт (которые находятся в " реальных "членов и которые находятся в скрытых, только для заполнения элементов).

Я бы сказал, что это не то, что вы можете легко сделать с помощью стандартного C.

+0

Как насчет C++? – pattern23

+0

@ pattern23 Я не знаю. У C++ может быть некоторый причудливый способ получить тип объекта с указателем (я не думаю, что RTTI покрывает это?), Но я только размышляю. – cnicutar

+0

Предположим, я нахожу фантастический способ обнаружить остроконечный тип. Затем, как я могу написать общую функцию, которая выполняет итерацию через элементы и сравнивает их по одному? – pattern23

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