【问题标题】:C comparison of array of pointers指针数组的C比较
【发布时间】:2012-07-10 08:20:23
【问题描述】:

我正在尝试编写一个函数来比较两个指针数组以查看它们是否相同。我想在任何指针数组上使用该函数,即不管指针指向什么 - 我只是对指针本身的相等性感兴趣

我写了这个:

/**
 * 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;
}

我的单元测试如下所示:

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 **’

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

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

  • a) 忽略警告
  • b) 重写函数以使编译器不发出警告
  • c) 对传入的指针进行一些转换
  • d) 接受 C 不喜欢不知道底层类型的想法,并为我可能遇到的每种指针类型重新编写函数

【问题讨论】:

    标签: c


    【解决方案1】:

    您的函数需要const void* 数组(指向第一个元素的指针)。

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

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

    在实现特定细节友好的前提下,它们几乎适用于任何实现,您可以使用memcmp 来比较数组。

    【讨论】:

    • +1:这是引用标准的另一个相关答案的link
    • 好的,所以我认为所有指针都应该是相同大小的想法是不正确的,我可以看到在这种情况下无法使用通用函数来比较指针?
    • @Hiett:是的,我已经编辑建议您可能需要点击“刷新”才能看到我的答案的最新版本。 memcmp 将起作用,前提是两件事:(1)实现中的所有指针都使用相同的表示,或者调用者总是传递两个相同类型的指针数组; (2) 在实现中指针类型中没有填充位,从而确保两个指针的对象表示当且仅当指针相等时才相等。
    • @Hiett 这是一个online working example。进行您认为合适的调整。
    • 不确定 - 由调用者指定正确的大小,我不确定是否可以为所有调用者概括最容易阅读和最强大的方法是指定他们拥有的数据的大小。一些用户需要将两个数字相乘,而另一些用户则可以轻松获得完整的大小(如testPTR_ARRAY_EQ)。如果您认为调用者“应该”总是将两个数字相乘,那么您可以模仿 calloc 并获取两个参数,自己将它们相乘,然后检查溢出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多