You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义memcmp函数实现遇阻:通用数组字节比较代码求助

修正你的byte_compare函数(模拟memcmp)

咱们先逐个揪出代码里的问题,再给出符合要求的修正版本:

原代码的核心错误

  • 变量名不匹配:函数定义的参数是b1和b2,但函数内部却用了p1和p2,这会直接导致编译失败。
  • 循环逻辑错误:
    • len已经是你指定要比较的字节数,而q1是char*指针,sizeof(*q1)固定为1,所以len*sizeof(*q1)完全是多余的操作,等于直接写len。
    • 循环条件用i<=len会让循环多执行一次(从0到len共len+1次),超出了你要求的字节长度,正确的应该是i<len。
  • 返回值不符合memcmp的标准行为:原代码只能返回0(相等)或1(不相等),但标准memcmp会返回负数、0、正数,分别表示第一个数组的字节小于、等于、大于第二个数组的对应字节,这样才能完整模拟其功能。
  • const正确性问题:你把const void*转换成了char*,丢失了const属性,应该转换成const char*,避免意外修改输入的只读数据。

修正后的完整代码

#include <stddef.h>  // 用于size_t类型的定义

int byte_compare(const void *b1, const void *b2, size_t len) {
    // 转换成const char*,保证const正确性
    const char *q1 = (const char *)b1;
    const char *q2 = (const char *)b2;
    
    for (size_t i = 0; i < len; i++) {
        if (*q1 != *q2) {
            // 返回差值,符合memcmp的返回规则:正数/负数表示大小关系
            return *q1 - *q2;
        }
        q1++;
        q2++;
    }
    // 所有字节都相等,返回0
    return 0;
}

// 测试示例
#include <stdio.h>
int main() {
    char arr1[] = "hello";
    char arr2[] = "world";
    int int_arr1[] = {1, 2, 3};
    int int_arr2[] = {1, 4, 3};
    
    // 比较char数组的前3个字节
    int cmp1 = byte_compare(arr1, arr2, 3);
    printf("char数组前3字节比较结果:%d\n", cmp1);  // 输出负数('h' < 'w')
    
    // 比较int数组的前4字节(第一个int的大小)
    int cmp2 = byte_compare(int_arr1, int_arr2, sizeof(int));
    printf("int数组第一个元素比较结果:%d\n", cmp2);  // 输出0(两个int的字节内容相同)
    
    // 比较int数组的前8字节(前两个int)
    int cmp3 = byte_compare(int_arr1, int_arr2, 2*sizeof(int));
    printf("int数组前两个元素比较结果:%d\n", cmp3);  // 返回2和4的字节差值
    
    return 0;
}

额外说明

  • 用size_t作为循环变量的类型,因为len是size_t(无符号整数),避免符号不匹配的问题。
  • 返回*q1 - *q2完全符合memcmp的行为:如果第一个不同的字节q1小于q2,返回负数;反之返回正数;全部相等返回0。
  • 支持任意类型的数组,因为我们把指针转换成char*来逐字节比较,这正是memcmp的核心逻辑。

内容的提问来源于stack exchange,提问作者Milo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:00:29