指针数组的C比较

指针数组的C比较,c,C,我试图编写一个函数来比较两个指针数组,看看它们是否相同。我想在任何指针数组上使用这个函数,也就是说,不管指针指向什么,我只是对指针本身的相等性感兴趣 我写了这样一篇文章: /** * Return true if arrays (of type ptr to ptr) are equal */ bool ptr_array_eq(const void **x, const void **y, size_t n) { size_t i; for (i=0; i<n; i+

我试图编写一个函数来比较两个指针数组,看看它们是否相同。我想在任何指针数组上使用这个函数,也就是说,不管指针指向什么,我只是对指针本身的相等性感兴趣

我写了这样一篇文章:

/**
 * Return true if arrays (of type ptr to ptr) are equal
 */
bool ptr_array_eq(const void **x, const void **y, size_t n)
{
    size_t i;
    for (i=0; i<n; i++) {
        if (x[i] != y[i]) {
            return false;
        }
    }
    return true;
}
但是当我编译时,我得到以下警告(不是错误):

编译器抱怨我在单元测试中使用的类型与函数原型不匹配

但我对底层类型并不感兴趣,只对它的指针感兴趣。我应该:

  • a) 不要理会这些警告
  • b) 重写函数,使编译器不会发出警告
  • c) 做一些传入指针的转换
  • d) 接受C不喜欢不知道底层类型的想法,并为我可能遇到的每种类型的指针重新编写函数
您的函数需要一个
常量void*
数组(指向的第一个元素的指针)

您正试图将它(指向的第一个元素的指针)传递给
Mode*
数组

这在C中是不允许的,因为(除其他原因外)C标准甚至不能保证
void*
Mode*
的大小相同。因此,该语言不允许程序意外地将一个数组当作另一个数组来处理


如果实现特定的细节是友好的,它们在几乎任何实现中都是友好的,那么您可以使用
memcmp
来比较数组。

+1:下面是引用标准的另一个相关答案。好吧,我认为所有指针都应该是相同大小的想法是错误的,我可以看出,在这种情况下,比较指针的通用函数是不可能的?@Hiett:是的,我已经编辑过了,建议您可能需要点击“刷新”来查看我答案的最新版本<只要有两件事,code>memcmp就可以工作:(1)要么实现中的所有指针使用相同的表示,要么调用方总是传递相同类型指针的两个数组;和(2)实现中的指针类型中没有填充位,因此确保两个指针的对象表示在且仅当指针相等时相等。@Hiett这里有一个例子。根据您认为合适的方式进行调整。不确定-由调用者指定正确的大小,我不确定是否可以为所有调用者概括最容易读取和最可靠的方法是指定他们拥有的数据的大小。一些用户将需要将两个数字相乘,其他用户将很容易获得完整的大小(如
testPTR\u ARRAY\u EQ
)。如果您认为呼叫者“应该”总是将两个数字相乘,那么您可以模仿
calloc
并获取两个参数,自己相乘,并在处理时检查溢出。
void testPTR_ARRAY_EQ(void)
{
    Mode *m1, *m2, *m3, *m4, *m5, *m6;

    Mode *a[] = {m1, m2, m3, m4, m5};
    Mode *b[] = {m1, m2, m3, m4, m5};
    Mode *c[] = {m2, m3, m4, m5, m6};
    Mode *d[] = {m1, m3, m4, m5, m6};

    CU_ASSERT(ptr_array_eq(a, a, 4));
    CU_ASSERT(ptr_array_eq(a, b, 4));
    CU_ASSERT(! ptr_array_eq(a, c, 4));
    CU_ASSERT(! ptr_array_eq(a, d, 4));
}
test_utility.c: In function ‘testPTR_ARRAY_EQ’:
test_utility.c:648:5: warning: passing argument 1 of ‘ptr_array_eq’ from incompatible pointer type [enabled by default]
../src/glamdring2.h:327:6: note: expected ‘const void **’ but argument is of type ‘struct Mode **’