我刚刚调试了一个令人难以置信的令人讨厌的错误:在我自己的PC(Windows 7 x64,MinGw)上,我的C程序将使用memcmpwhen比较数组成员成功对数组进行排序.
我的函数使用冒泡排序算法,它的骨架看起来像这样:
void array_sort(ArrayMap *array, char direction) {
make sure direction is +1 or -1 only
define some variables
for(...) {
for(...) {
cmpres = memcmp(elm1, elm2, sizeOfElement);
if (cmpres!=0&&cmpres!=direction)
{
SWAP here
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在我的电脑上,memcmp已经返回-1,0而1在另一个电脑上,它又返回了-5,0并且5.通过与direction我的比较,导致排序完全错误.
但我想知道,返回值的绝对值(即大小)memcmp究竟是什么意思?
返回表示存储块内容之间关系的整数值:零值表示两个存储块的内容相等.的值大于零表示不在两个存储器块匹配的第一个字节在PTR1比PTR2更大的值,如同评价为无符号字符值; 小于零的值表示相反.
没有提到大小,他们只是通过大于零来确保+ -1的错误.
结果幅度特定于实现,因此它没有可移植的意义,您不应依赖它。该memcmp()函数仅保证返回正值、负值或零值。
之所以允许它具有任何值,memcmp()可以这样定义:
// Types changed to "char" to simplify code.
int memcmp(const unsigned char *x, const unsigned char *y, size_t n)
{
for (size_t i = 0; i < n; i++) {
int diff = x[i] - y[i];
if (diff)
return diff;
}
Run Code Online (Sandbox Code Playgroud)
但也可以使用例如SSE来实现,并且返回值会有所不同。
该文件说:
如果s1指向的对象分别大于,等于或小于s2指向的对象,则memcmp()函数将返回大于,等于或小于0的整数.
它并没有说它将返回-1或1.它确切返回的是依赖于实现的.
更新:
在实现比较功能时,您经常会写:
return a[i] - b[i];
Run Code Online (Sandbox Code Playgroud)
代替:
if (a[i] > b[i])
return 1;
else
return -1;
Run Code Online (Sandbox Code Playgroud)
这是一个可能的实现,解释了返回的数字.