微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在添加条目之前将数组清零

如何解决在添加条目之前将数组清零

以下是否将列表清零,然后添加一个条目?还是只是将第一个条目添加handlers

 Logger = (struct logger) {.level=INFO,.format=DEFAULT_FORMAT,.num_handlers=1,.handlers[0]=stdout};

例如,这样做是否:

Logger.handlers = {0};
Logger.handlers[0] = stdout;

或者不涉及清算?

解决方法

例如,这样做是否:

Logger.handlers = {0};
Logger.handlers[0] = stdout;

答案:是的(但不是按特定顺序)

C11 Standard § 6.7.9 - Initialization 部分下有三个标准部分(如果您采用专门使以下两个适用于“聚合对象”(结构和数组)的部分,则实际上为 4 个)。您的案例询问“如果在初始化期间只为 Logger.handlers 提供了一个值,那么 Logger.handlers[0] = stdout; 的其他元素会发生什么情况?”

要回答这个问题,您需要查看 § 6.7.9 Initialization (p19)§ 6.7.9 Initialization (p21)

第一个指定结构的初始化如何以“列表顺序”发生,"all subobjects that are not initialized explicitly shall be initialized implicitly the same as objects that have static storage duration." 因此,如果您提供的值少于所有值来完全初始化子对象,则未提供值的那些将被初始化,就好像它们具有静态存储一样期间。 (具有静态存储持续时间的对象,未明确初始化,初始化为零(或 NULL,视类型而定),参见:§ 6.7.9 Initialization (p10)

第 21 段特别涵盖了在大括号括起来的列表中提供的初始值设定项较少的情况 -- "all subobjects that are not initialized explicitly shall be initialized implicitly the same as objects that have static storage duration." § 6.7.9 Initialization (p21)

所以总而言之,Logger.handlers 的初始化实际发生的是第一个元素被初始化为 stdout 而所有其他元素都被初始化为 NULL(因为 stdout 是一个指针FILE* 类型)。所以你实际上拥有的是:

Logger.handlers[CONST] = { stdout,NULL,... };

再看一遍(阅读 § 6.7.9 的全部内容),如果您还有其他问题,请告诉我。

,

后者Logger.handlers[0] = stdout;。这就是为什么 API 有一个 .num_handlers 字段来告诉被调用的代码知道有多少处理程序是有效的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?