C 如何检查数组中是否存在(子)数组

C 如何检查数组中是否存在(子)数组,c,windows,C,Windows,我需要介于strstr和memcmp之间的东西来检查内存范围中是否存在数组 举例说明我想要实现的目标: BYTE a[] = { 0x01, 0x02, 0x03, 0x04 }; BYTE b[] = { 0x02, 0x03 }; if (mem_in_mem(a, b, 4 * sizeof(BYTE)) == 0) { printf("b is in memory range of a\n"); } 你知道我该怎么做吗? (应与windows一起使用)函数mem\u in\u

我需要介于
strstr
memcmp
之间的东西来检查内存范围中是否存在数组

举例说明我想要实现的目标:

BYTE a[] = { 0x01, 0x02, 0x03, 0x04 };
BYTE b[] = { 0x02, 0x03 };
if (mem_in_mem(a, b, 4 * sizeof(BYTE)) == 0) {
    printf("b is in memory range of a\n");
}
你知道我该怎么做吗?
(应与windows一起使用)

函数
mem\u in\u mem
应采用两个数组的大小。下面是一个过于简单的实现:

#include <string.h>

void *mem_in_mem(const void *haystack, size_t n1, const void *needle, size_t n2) {
    const unsigned char *p1 = haystack;
    const unsigned char *p2 = needle;

    if (n2 == 0)
        return (void*)p1;
    if (n2 > n1)
        return NULL;

    const unsigned char *p3 = p1 + n1 - n2 + 1;
    for (const unsigned char *p = p1; (p = memchr(p, *p2, p3 - p)) != NULL; p++) {
        if (!memcmp(p, p2, n2))
            return (void*)p;
    }
    return NULL;
}

当然,你可以编写这个函数。为什么不
memcmp
并每次前进一个字符,直到检查完整个缓冲区?不幸的是,建议的
mem\u in\u mem
函数没有被告知(Sub)的长度它应该匹配的数组。在提交到
memcmp
的昂贵函数调用之前,通过检查第一个字节进行优化。看起来您可能想要实现。不过,无论如何,函数都需要知道目标数组和测试数组的边界。@immibis可能在您的库中,但它仍然需要一个函数调用,如果简单测试失败,可以避免调用。正如
int*ptr=malloc(8)不需要强制转换,也不需要返回(void*)p也许window的C很挑剔?啊,我觉得有必要放弃
常量
BYTE a[] = { 0x01, 0x02, 0x03, 0x04 };
BYTE b[] = { 0x02, 0x03 };
if (mem_in_mem(a, sizeof a, b, sizeof b)) {
    printf("b is in memory range of a\n");
}