gpt4 book ai didi

c - 通用数组搜索器和填充

转载 作者:行者123 更新时间:2023-11-30 16:33:36 26 4
gpt4 key购买 nike

我一直在尝试实现一个通用数组搜索器,并遇到了 this答案,这让我认为我的实现仅对动态分配的数组有效。

实现如下所示:

void *array_search( void *arr,
size_t elem_size,
size_t len,
arr_search_checker v,
void *match)
{
char *p = arr;
for(unsigned i = 0; i < len; ++i)
{
if(v((void *) p, match))
return p;
p += elem_size;
}

return NULL;
}

类型arr_search_checker:

typedef bool (*arr_search_checker)(void *, void *);

结构简单:

struct test_struct { int i; char c; };

还有一个检查函数:

bool test_checker(void *l, void *r)
{
struct test_struct *ls = l, *rs = r;
return ls->i == rs->i && ls->c == rs->c;
}

长度为 lenarray 是一个可以调用搜索器的 struct test_struct 数组:

struct test_struct match = { .i = 5, .c = 'A' };
struct test_struct *res = array_search(array,
sizeof(struct test_struct), len, test_checker, &match);

由于 char 指针 p 按数组中单个元素的大小递增,因此 array_search 的实现仅对动态分配的数组有效,这是真的吗?对于填充数组来说可能很危险吗?还是完全无效?

最佳答案

请在问题主题中陈述您的问题。
函数 array_search 对任何数组都有效(不知道为什么动态分配的数组在任何方面都是特殊的)。字符指针 p 按 elem_size 递增。在您的示例中,为 elem_size 分配了 sizeof(struct test_struct) 的值,这完全没问题。填充与此无关。想象一下 struct test_struct 添加了一些填充字节(在结构的末尾或任何成员之间的任何位置)。那么 sizeof(struct test_struct) 将是 test_struct 结构的大小,包括填充字节,并且 p 仍然会正确递增。
您可以将任何指向 void* 的指针和任何指向 char* 的指针转换,而无需打破严格的别名规则。您无法对 void* 指针进行算术运算,这就是它被转换为 char* 指针的原因。 elem_size 表示单个数组元素的大小(以字节为单位),char 表示内存中的一个字节,通过执行 p += elem_size; 可以添加 elem_size字节到 p (我喜欢这种形式 p = &p[elem_size];)。 C 中的最小可寻址大小是一个字节(请记住,字节可能不是 8 位),并且 C 中每个结构或类型的大小必须是整数值(即 sizeof(struct test_struct) 不能返回 1,5)。
更多请查看bsearchqsort标准 C 库中的函数。它们与 array_search 具有非常相似的声明,并且适用于任何数组类型,就像此处的 array_search 一样。

关于c - 通用数组搜索器和填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49689897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com