在另一个数组中查找一个数组的元素,为什么会出现此错误?

find elements of an array in another array, why do I have this error?

我试图将这个练习的算法可视化,但我遇到了很多问题。

练习要求实现这个功能:

extern const void *memmem(const void *haystack, size_t hsize, const void *needle, size_t nsize); 

我希望我比原来的练习解释得更好(它不清楚,所以我很难理解它)。


我试过这样描述算法:

algorithm accepts two pointers and their sizes. (loop) increment *needle by one at each step in order to find a common element (comparing that element with the current element of haystack), and if that condition is true, increment a counter by one. Doing this way I've obtained the length of the final array. Then, I allocate enough memory, and do another loop to copy each element in the final vector. last but not least, return this pointer.

这是它在代码中的样子(我知道它不完整,但我目前正在逐步构建它,一点也不容易):

#include <stdlib.h>
const void* memmem(const void* haystack, size_t hsize, const void* needle, size_t nsize) {
    if ((hsize == 0) || (nsize = 0)) {
        return NULL; // here, I should've done a NULL pointer exception check too, because haystack and needle may be null pointer too. for now, ignore that. 
    }
    for (size_t i = 0; i < nsize; i++) {
        if (needle[i] == haystack[i])
    } 

}


int main(void) {

    int haystack[] = {-1, 0, 1, 2, 3, 4};
    size_t hsize = 6; 
    int needle[] = {-1, 8, 4, 2};
    size_t nsize = 4; 

    int* ptr = memmem(haystack, hsize, needle, nsize); 


    return 0; 
}

重点来了:

for (size_t i = 0; i < nsize; i++) {
            if (needle[i] == haystack[i])
        } 

因为我有这个错误:expression must be a pointer to a complete object type。这是什么意思?我以前从未听说过此错误消息。数组是完整的,我已经正确定义了它们,所以我不知道为什么我有那个。

类型void是不完整的类型。它的大小是未知的。编译器无法确定该类型对象的大小(尽管为了向后兼容,一些编译器有自己的扩展,确定 sizeof(void) 等于 1。但这不满足 C 标准)。

来自 C 标准(6.2.5 类型)

19 The void type comprises an empty set of values; it is an incomplete object type that cannot be completed.

因此您不能取消引用 cv void * 类型的指针。您需要将指针转换为指向完整对象类型的指针才能访问指向的对象。

无论如何这个for循环

for (size_t i = 0; i < nsize; i++) {
    if (needle[i] == haystack[i])
} 

即使转换指针也是不正确的,因为 nsizehsize 可能不相等。

我想你需要两个嵌套的 for 循环。

此外,函数的 return 类型中至少还有限定符 const

extern const void *memmem(const void *haystack, size_t hsize, const void *needle, size_t nsize); 

没有多大意义。它应该被删除。