gpt4 book ai didi

c - 这行 C 代码为 HashMap 实现做了什么?

转载 作者:太空宇宙 更新时间:2023-11-04 06:12:47 25 4
gpt4 key购买 nike

在工作中,我们一直在努力弄清楚这段代码的作用,我们觉得它可能会导致问题。这是 C 中的 hashmap 实现。

static thrift_map_node_t *thrift_map_newnode (thrift_map_base_t *m, union keyDataTypes key, void * value, int vsize)

thrift_map_node_t *node;
int ksize = strlen(key) + 1;
int voffset = ksize + ((sizeof(void*) - ksize) % sizeof(void*));
node = malloc(sizeof(*node) + voffset + vsize);
if (!node) return NULL;
memcpy(node + 1, key, ksize);
node->hash = thrift_hash(key);
node->value = ((char*) (node + 1)) + voffset;
memcpy(node->value, value, vsize);
return node;

我们认为的问题就在这里

  int voffset = ksize + ((sizeof(void*) - ksize) % sizeof(void*));

我们认为这可能会产生负值,例如 C 中的 -9 % 4 = -1。

解决此问题或对其尝试执行的操作提供任何帮助会很好。

最佳答案

不,它不能永远产生负值if size_t 的排名高于或等于int (除了在一些非常奇怪的 32 位整数的 16 位寻址系统上,它确实如此),因为那时

sizeof (void*) - ksize

将是 size_t 类型,它是无符号类型且始终为正数。因此,如果 void 指针为 8 字节宽且 ksize 为 17,则减法结果为 (size_t)-9,或者在 64 位机器上为 18446744073709551607。模 8 是 7,加上 17 将得到 24,它是 sizeof (void *) 的倍数。

但是,这依赖于 sizeof (void *)2 的幂,因此如果您使用它会更好

sizeof (void*) - (ksize + sizeof (void*)) % sizeof (void *)

用于填充,因为这完全避免了负数


尽管 结果减法是 signed 是真的,因为 C99 模总是负数:(-3) % 4 例如 -3

顺便说一句,代码不应该使用sizeof (void *),而是_Alignof (void *)


代码中还有一件可疑的事情。假设有人实际上可以输入长度超过 2 GiB 的字符串 - 那么在大多数平台上都会发生有符号溢出,这不会很漂亮!

关于c - 这行 C 代码为 HashMap 实现做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52927007/

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