使用char成员定制struct的memcmp()

时间:2015-03-05 15:18:56

标签: c memory memcmp

我编写了以下C代码来比较两个内存区域并检查它们是否相同

#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变量后面有3个填充字节 充满随机数据,而不是像我期待的那样用零。

知道这个以及我希望尽可能保持通用的事实(所以使用void *作为参数),有人可以指向另一个字节到字节的比较吗?

(在某人问之前,我正在编写自定义memcmp(),因为在某些实现中it will continue after a difference

1 个答案:

答案 0 :(得分:3)

  

了解这一点以及我希望将其保持为通用的事实   可能(所以使用void *作为参数

如果您只使用void *指针,根据定义,您对对象的内部组织一无所知。这意味着你对字节的含义一无所知(它们在“真实”成员中,并且在隐藏的,仅填充成员中)。

我想说这不是你可以用标准C轻松做的事情。