在另一个数组中查找一个数组的元素,为什么会出现此错误?
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);
- haystack 和 needle 是指向两个不同内存区域的两个指针。 haystack指向一块hsize大小的内存,needle指向一块nsize大小的内存。
- 在*haystack 中找到*needle 元素,如果*needle 元素也在*haystack 中,return 指向新分配内存(包含*needle 元素)的指针,并且该指针必须指向新内存的第0个元素。
我希望我比原来的练习解释得更好(它不清楚,所以我很难理解它)。
我试过这样描述算法:
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])
}
即使转换指针也是不正确的,因为 nsize
和 hsize
可能不相等。
我想你需要两个嵌套的 for 循环。
此外,函数的 return 类型中至少还有限定符 const
extern const void *memmem(const void *haystack, size_t hsize, const void *needle, size_t nsize);
没有多大意义。它应该被删除。
我试图将这个练习的算法可视化,但我遇到了很多问题。
练习要求实现这个功能:
extern const void *memmem(const void *haystack, size_t hsize, const void *needle, size_t nsize);
- haystack 和 needle 是指向两个不同内存区域的两个指针。 haystack指向一块hsize大小的内存,needle指向一块nsize大小的内存。
- 在*haystack 中找到*needle 元素,如果*needle 元素也在*haystack 中,return 指向新分配内存(包含*needle 元素)的指针,并且该指针必须指向新内存的第0个元素。
我希望我比原来的练习解释得更好(它不清楚,所以我很难理解它)。
我试过这样描述算法:
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])
}
即使转换指针也是不正确的,因为 nsize
和 hsize
可能不相等。
我想你需要两个嵌套的 for 循环。
此外,函数的 return 类型中至少还有限定符 const
extern const void *memmem(const void *haystack, size_t hsize, const void *needle, size_t nsize);
没有多大意义。它应该被删除。