【问题标题】:Properly clearing an array正确清除数组
【发布时间】:2016-12-17 08:01:36
【问题描述】:

我见过两种用0 填充char[] 的不同方法(在此示例中,在初始化时):

/* method 1 */
char foo[1024] = {0};

/* method 2 */
char foo[1024];
memset(foo, '\0', sizeof(foo));

这两个代码的主要区别是什么?它们在功能等方面有何不同?

【问题讨论】:

  • 它们在功能上有什么不同,”你指的是哪个功能?
  • @alk 他们实现了完全相同的最终目标吗?如果不是,有什么区别?
  • 是的,调用memset后,案例2的foo与案例1的foo的内容相同,即全部0s。
  • @alk 好的,谢谢;只是想知道,一种被认为比另一种更好的做法吗?
  • 现在来吧,请重新设计重新设计。就目前而言,它使 GUI 变得混乱。

标签: c arrays memset


【解决方案1】:

这两个代码的主要区别是什么?

在情况 1 中,数组从可以使用的那一刻起就被清零,因为它已初始化

在情况 2 中,它的内容只有在调用 memset() 之后才被明确定义。

本质区别在于,对于案例 2,foo 的内容是“垃圾”的地方存在差距。情况 1 并非如此。

【讨论】:

  • 所以基本上,memset(foo, ...)0 填充数组,就像foo = {0} 一样?
  • "in 完全一样"我们不知道编译器做了什么,但是结果是一样的,是的。
  • *"在 完全一样的方式"
【解决方案2】:

第一种方式通常更好,因为它将所有成员初始化为零。 Mem 设置为 0 并不总是与零初始化相同,特别是对于浮点和指针成员,它们可能有 0 值,而不是所有位为零。

性能方面,我不知道哪个会更快,你必须衡量它。顺便说一句,你可以在 memset 中使用0 代替'\0'

memset(foo, 0, sizeof(foo));

【讨论】:

  • 您能否举例说明初始化数组(例如浮点零)不会将所有位设置为 0 的情况? IEEE 754 中的浮点零由所有位设置为 0(或符号位设置为 1)表示。
  • @DavidBowling 我同意你的观点。在回答这个问题时,我不仅考虑了 0,还考虑了任何浮点值。例如,9.0。在 java 中,有时我看到 9.0 被认为是 8.999999999999999.... 所以,使用 memset(根据我)来初始化浮点值有点冒险。
  • 我并不完全相信这里的浮点值,并不是说这是一个坏主意,我会再考虑一下。但是,就初始化数组NULL 指针而言,选择初始化器而不是memset() 似乎是个好主意,因为NULL 宏是实现定义的。有趣的点。
  • 我只是更喜欢其中之一,我并不是说其中任何一个都是坏主意,请注意这一点。此外,我不同意你的观点。我唯一的偏好是 - 在浮点值的情况下避免使用 memset()
  • @DavidBowling 例如一个非 IEEE754 系统,或者对于指针,一个系统期望使用地址零,因此空指针由其他模式表示
【解决方案3】:

这两个代码的效果是一样的。在这两种情况下,编译器可能会生成相同的程序集。然而,第一个更容易阅读和维护。

您不可能在第一个数据中意外写入错误长度的数据。

此外,= { 0 }; 习惯用法可用于初始化所有命名数组和结构:整数获取 0 值,浮点获取 0.0,指针获取空指针。 memset 版本只保证这三件事中的第一件事。

因此,如果您正在编写可移植代码,则有时无论如何都需要使用= { 0 }——因此您不妨每次都使用它。

【讨论】:

  • 我从一开始就对NULL 指针深信不疑,经过进一步思考,我发现了浮点数初始化器的问题。你和@WasiAhmad 提出了一个很好的观点;这是我喜欢 SO 的原因之一。总是要学习新东西:)
【解决方案4】:
/* method 1 */
char foo[1024] = {0};

在方法 1 中,数组的设置发生在程序加载时,通常来自文字,并且对于数组“范围”中的每个条目只能发生一次。

/* method 2 */
char foo[1024];
memset(foo, '\0', sizeof(foo));

在方法2中,数组的设置发生在运行时,消耗运行时CPU周期,可以根据需要多次发生。

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多