【问题标题】:What is the reason for memsetting initialized buffermemsetting初始化缓冲区是什么原因
【发布时间】:2013-05-13 17:58:11
【问题描述】:

在通过一些链接遍历 Wikipedia 时,我偶然发现了 the following code example 将 char 缓冲区初始化为 0,但随后 memsets 在使用前将其初始化为 0。这是必要的吗?如果是这样,为什么?我问的原因是我不是专家,示例清楚地表明这是编码人员的意图,在 memset 上添加注释“/* Really initialized to zeroes */”,而不是在初始化时使用“/* initialized to zeroes */”。

编辑:请注意,我已经回滚了导致此问题的维基百科页面上的编辑,因此它不再在链接中可见。

【问题讨论】:

  • 本质上,清理存储在分配的内存部分中用于先前计算的“垃圾”
  • 您会看到两个方向的示例 - 代码无法正确确保缓冲区已初始化,但由于某种形式的运气而没有遇到问题(我称之为测试运气不佳)没有发现错误)。另一方面,我经常看到这样的代码:memset(buffer,0,sizeof(buffer));snprintf(buffer,sizeof(buffer),"foo is %d",foo); 不需要清除缓冲区,因为它总是会得到一个格式良好的、以空结尾的字符串。但我想,安全总比后悔好。

标签: c initialization memset


【解决方案1】:
char buffer[5] = {0};  /* initialized to zeroes */

/* some declaration / statements, but no access to buffer object */

memset ( buffer, 0, sizeof buffer); /* Really initialized to zeroes */

在上面的代码中,对memset 的调用完全没有用。 buffer 已经保证被初始化为 0

【讨论】:

  • 太好了,谢谢。另一个不盲目相信维基百科的原因,我想
  • 我看不出用{ 0 } 初始化和用memset() 初始化char 数组之间有任何区别,但是,对于其他类型,可以有一个奇异系统,其中 0.0 不是用所有位为零表示的,通过在指针上下文中写入 0 得到的空指针不是用所有位为零表示的,...
  • @PascalCuoq,对于struct 类型,memset 还可以保证填充为零。
  • C11 还保证填充为零,如果我没记错的话。
【解决方案2】:

跟进 ouah 的回答。如果你有

char buffer[5] = { 0 } ;

int main(int argc, char **argv)
{
    memset ( buffer, 0, sizeof buffer);
    ...

可能有一个例外:如果您真的进行低级 C 编程(没有操作系统)并且您的 C 程序在没有完整工作环境的情况下直接调用,那么 buffer 数组可能在这种情况下没有正确初始化,因为缺少必要的初始化代码(main之前运行的代码)。

在这种情况下,情况正好相反:初始化是无用的(因为它在这个特定的环境中不起作用)并且memset 是必要的。

但正如我所说:这实际上只发生在极低级别的 C 编程中,实际上是环境中的一个错误,它为您提供了一个不符合 C 的环境。

【讨论】:

  • 感谢您的洞察力 - 虽然我知道不符合标准的 C 环境,但我没有意识到存在一些无法执行明确要求的操作。
  • 我认为这个答案接近于有害的 FUD。大约十年前,每个人都持有各种未经证实的信念,即 C 实现的差异有多大,而且你经常会发现黑客可以“移植”到那些从一开始就从未存在或早已过时的实现,并且即使它们确实存在,也不会是 C 实现(而是一种丑陋的类 C 语言)。带回这种怀疑是不是进步。除非您知道没有正确初始化对象的特定有趣目标,否则这样的推测是没有帮助的。
  • @R.. 好吧:如果您需要用 C 编写引导加载程序的一部分(就像我不久前必须要做的那样),您真的应该知道我上面写的内容。这肯定是不是 FUD,如果您必须在低级别编写,您通常会编写自己的链接器脚本,而这反过来可能意味着您根本没有任何“标准”初始化代码......跨度>
  • 有问题的代码与程序初始化无关。问题中的数组具有自动存储持续时间,因此,编译器负责生成代码,在每次调用函数时将其填零。
  • 好的,我明白了:我没有看到buffer[5] = {0} 实际上位于函数内部的上述代码。我刚刚看到第一个答案,并假设代码在函数之外,这就是我的答案所指的。我会编辑这个...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 2022-01-21
  • 2021-10-27
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多