gpt4 book ai didi

C 约定 - 如何在结构的数组字段上使用 memset

转载 作者:行者123 更新时间:2023-12-02 01:36:14 27 4
gpt4 key购买 nike

我想解决关于在将结构中的数组字段归零时正确使用 memset 的争论(语言是 C)。

假设我们有以下结构:

  struct my_struct {
int a[10]
}

以下哪个实现更正确?

选项 1:

void f (struct my_struct * ptr) {
memset(&ptr->a, 0, sizeof(p->a));
}

选项 2:

void f (struct my_struct * ptr) {
memset(ptr->a, 0, sizeof(p->a));
}

注意事项:

如果该字段是原始类型或另一个结构(例如“int”)选项 2 将不起作用,如果它是指针 (int *),则选项 1 将不起作用。

请指教,

最佳答案

对于非复合类型,您根本不会使用 memset,因为直接赋值会更容易并且可能更快。它还允许编译器优化函数调用不支持。

对于数组,变体 2 有效,因为数组被隐式转换为用于大多数 操作的指针。

对于指针,请注意,在变体 2 中使用指针的,而不是指针本身,而对于数组,使用指向数组的指针.

变体 1 产生对象本身的地址。对于指针,这是指针的地址(如果这个“工作”取决于您的意图),对于数组,它是数组的地址 - 它恰好总是它的第一个元素的地址 - 但类型在这里不同(无关紧要,因为 memset 采用 void * 并在内部转换为 char *)。

因此:这取决于;对于一个数组,我实际上并没有看到太大的区别,除了地址运算符可能会混淆不那么熟悉的运算符优先级的读取(而且它更多的是键入)。作为个人意见:我更喜欢更简单的语法,但不会提示另一个。

请注意,memset 具有除 0 之外的任何其他值实际上没有多大意义;它甚至可能无法保证将指针数组解释为空指针

关于C 约定 - 如何在结构的数组字段上使用 memset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31121664/

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