2

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

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

4

2 回答 2

10
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.

于 2013-05-13T18:00:10.637 回答
2

跟进 ouah 的回答。如果你有

char buffer[5] = { 0 } ;

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

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

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

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

于 2013-05-13T19:52:22.773 回答