Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 设置初始化缓冲区的原因是什么_C_Initialization_Memset - Fatal编程技术网

C 设置初始化缓冲区的原因是什么

C 设置初始化缓冲区的原因是什么,c,initialization,memset,C,Initialization,Memset,在跟随一些链接浏览维基百科时,我偶然发现了一个方法,它将一个字符缓冲区初始化为0,但在使用之前,memsets将其设置为0。这有必要吗?若然,原因为何?我问这个问题的原因是我不是专家,这个例子清楚地表明这是编码者的意图,在memset上注释“/*真的初始化为零*/”,而不是在初始化上注释“/*初始化为零*/” 编辑:注意,我已经回滚了导致此问题的维基百科页面上的编辑,因此它在链接中不再可见 char buffer[5] = {0}; /* initialized to zeroes */ /

在跟随一些链接浏览维基百科时,我偶然发现了一个方法,它将一个字符缓冲区初始化为0,但在使用之前,
memset
s将其设置为0。这有必要吗?若然,原因为何?我问这个问题的原因是我不是专家,这个例子清楚地表明这是编码者的意图,在
memset
上注释“
/*真的初始化为零*/
”,而不是在初始化上注释“
/*初始化为零*/

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

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
的调用是完全无用的<代码>缓冲区已保证在ouah回答后初始化为
0

。如果你有

char buffer[5] = { 0 } ;

int main(int argc, char **argv)
{
    memset ( buffer, 0, sizeof buffer);
    ...
可能有一个例外:如果您真的执行低级C编程(没有操作系统),并且在没有完全工作环境的情况下直接调用C程序,那么在这种情况下,
缓冲区
数组可能无法正确初始化,因为需要初始化代码(在
main
之前运行的代码)丢失

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


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

本质上,清除“垃圾”为以前的计算存储在分配的内存中,您可以看到两个方向的示例—不能正确确保缓冲区已初始化的代码,但由于某种形式的运气(我称之为坏运气,测试没有解决错误)。另一方面,我经常看到类似:
memset这样的代码(缓冲区,0,sizeof(缓冲区));snprintf(缓冲区,sizeof(缓冲区),“foo是%d”,foo);
不需要清除缓冲区,因为它总是得到一个格式良好、以null结尾的字符串。但我想,安全总比抱歉好。非常好,谢谢。另一个不盲目信任Wikipedia的原因是,我想我看不出使用
{0}初始化之间有任何区别
和使用
memset()初始化
对于
char
数组,但是对于其他类型,在异域系统上可能会有一种类型,其中0.0不是用所有位零表示的,通过在指针上下文中写入
0
得到的空指针不是用所有位零表示的,@PascalCuoq对于
struct
类型,
memset
也会保证填充被归零。如果我没有弄错的话,C11还保证填充被归零。感谢您的这一见解-虽然我知道不符合标准的C环境,但我没有意识到存在一些无法满足明确要求的情况。我认为这一答案近乎有害的FUD。大约十年前,每个人都持有所有证书各种未经证实的关于C实现的差异有多大的信念,你经常会发现黑客可以“移植”到那些从一开始就不存在或早已过时的实现中,而这些实现不是C实现(而是一种丑陋的C语言)即使它们确实存在。带回这种怀疑并不是进步。除非你知道某些特定的有趣的目标不能正确初始化对象,否则这种推测是没有帮助的。@R..嗯:如果你需要用C编写引导加载程序的一部分(就像我不久前不得不做的那样),你真的应该知道我在上面写了什么。这肯定不是FUD,如果你必须在那么低的级别上写,你通常会写你自己的链接器脚本,这可能意味着你根本没有任何“标准”初始化代码…所讨论的代码与程序初始化无关。所讨论的数组具有自动存储持续时间,因此,编译器负责生成代码,该代码在每次调用函数时由zero填充。好的,我明白了:我没有看到所提到的代码中的
缓冲区[5]={0}
实际上在函数内部。我刚刚看到第一个答案,并假设代码在函数外部,这就是我的答案所指的。我将编辑此。。。