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++) { if (x[i] != y[i]) { return false; } } return true; }
我的unit testing看起来像这样:
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 **'
与编译器抱怨在我的unit testing中我使用的类型与函数原型不匹配
但我对底层类型并不感兴趣,只有指向它的指针。 我是不是该:
- a)忽略警告
- b)以使编译器不发出警告的方式重写函数
- c)做一些传入指针的演员
- d)接受C不喜欢不知道底层类型的想法并重新编写我可能遇到的每种指针类型的函数
你的函数需要(一个指向第一个元素的指针)一个const void*
数组。
你试图传递它(一个指向第一个元素的指针)一个Mode*
数组。
这在C中是不允许的,因为(除其他原因外)C标准甚至不保证void*
和Mode*
的大小相同。 所以语言不会让程序意外地处理一个数组,就好像它是另一个数组。
根据实现特定的细节是友好的,它们几乎在任何实现中,您可以使用memcmp
来比较数组。