c语言中数组的等价性

c语言中数组的等价性,c,arrays,C,Arrays,我必须用整数元素检查两个数组(1-D)的相等性 int IsEqual2(int array1[], int array2[], size_t n1, size_t n2) { /* n1 and n2 are number of ints in array1 and array2 respectively */ return n1 == n2 && !memcmp(array1, array2, n1 * sizeof(int)); } int

我必须用整数元素检查两个数组(1-D)的相等性

 int IsEqual2(int array1[], int array2[], size_t n1, size_t n2)
 {
      /*  n1 and n2 are number of ints in array1 and array2 respectively */
     return n1 == n2 && !memcmp(array1, array2, n1 * sizeof(int));
 }

 int main()
 {
      int arr1[] = { /* whatever */ };
      int arr2[] = { /* whatever */ };

      is_equal = IsEqual2(arr1, arr2, sizeof(arr1)/sizeof(*arr1), sizeof(arr2)/sizeof(*arr2));
      return 0;
 }
我明白没有直接的比较方法。所以我在做基本的迭代,检查每个元素是否相等

 for ( int i = 0 ; i < len ; i++) {
    // Equality check
for(int i=0;i
在C语言中,测试数组相等性的最有效方法是什么?我能以某种方式避开循环(例如…)吗?

使用函数比较两个长度相等的数组

int a = memcmp(arr1, arr2, sizeof(arr1));
if(!a)
    printf("Arrays are equal\n");
else
    printf("Arrays are not equal\n");
您可以使用for循环方法

或者
memcmp
也是比较数组的有效方法。 提及

int memcmp(常数空*s1,常数空*s2,大小n)

您可以将前n个字节与此函数进行比较

int array1[5],array2[5]; 
int x = memcmp(array1, array2, sizeof(array1));
如果阵列大小不同,则:

  • sizeof(array1)小于sizeof(array2),它返回负值
  • sizeof(array1)大于sizeof(array2),则返回正值
  • sizeof(array1)等于sizeof(array2),则返回零

    如何使用
    memcmp
    ?也是如此


记住
memcmp
只有当内存元素或数组大小相等时才有用

正如其他人所说,使用
memcmp()
是有效的

假设实际数组,一般的答案是

int is_equal = sizeof(array1) == sizeof(array2) && !memcmp(array1, array2, sizeof(array1));
如果数组作为函数的指针参数提供,那么大小信息将丢失,需要单独提供

 int IsEqual(void *array1, void *array2, size_t size1, size_t size2)
 {
     return size1 == size2 && !memcmp(array1, array2, size1);
 }

 int main()
 {
      int arr1[] = { /* whatever */ };
      int arr2[] = { /* whatever */ };

      is_equal = IsEqual(arr1, arr2, sizeof(arr1), sizeof(arr2));
      return 0;
 }
或者,在转换为
void
指针之前,尽可能晚地保留类型信息(即使用
int
数组的知识),并使用元素数

 int IsEqual2(int array1[], int array2[], size_t n1, size_t n2)
 {
      /*  n1 and n2 are number of ints in array1 and array2 respectively */
     return n1 == n2 && !memcmp(array1, array2, n1 * sizeof(int));
 }

 int main()
 {
      int arr1[] = { /* whatever */ };
      int arr2[] = { /* whatever */ };

      is_equal = IsEqual2(arr1, arr2, sizeof(arr1)/sizeof(*arr1), sizeof(arr2)/sizeof(*arr2));
      return 0;
 }

您可以使用
memcmp
问题是,我在另一个重循环中执行此操作,因此它非常重。但我使用相等性检查作为约束,因此结果必须带有一个赋值,以确保每个数组元素相等,因此显示的短路技巧不会有多大用处。谢谢punit。@user2754673没有这里是“短路技巧”。考虑到你的问题在很大程度上是另一个问题的重复,这是一个完全有效的答案。这个答案的唯一缺陷是它受到与haccks答案相同的限制(数组大小是否相等?)@punitvara请解释您添加的关于位填充的评论。只要两个数组类型相同,C数组就不会使
memcmp
不可靠。我希望现在我已经澄清了提问者的所有疑问:-)注意,像这样使用sizeof运算符,array1必须是数组类型,而不是a指针(例如函数参数)。这仅在已知数组长度相同的情况下有效。如果
arr1
arr2
短,则会产生误报。如果
arr1
arr2
长,则会产生未定义的行为,最有可能是seg错误的形式。@CareyGregory;我没有提到它是有效的吗d表示长度相等的数组。你是这样做的。我忽略了这一点,所以我道歉并收回我的反对票。很难想象如果两个数组的长度不相同,它们怎么可能相等。