首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清零内存

清零内存
EN

Stack Overflow用户
提问于 2010-05-22 01:35:14
回答 12查看 52.9K关注 0票数 28

gcc 4.4.4 C89

我只是想知道大多数C程序员在想清零内存时会怎么做。

例如,我有一个1024字节的缓冲区。有时我会这样做:

代码语言:javascript
复制
char buffer[1024] = {0};

这将使所有字节归零。

但是,我应该像这样声明它并使用memset吗?

代码语言:javascript
复制
char buffer[1024];
.
.
memset(buffer, 0, sizeof(buffer));

有没有什么真正的理由让你把内存清零?如果不这样做,最坏的结果是什么?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2010-05-22 01:47:13

最坏的情况会发生吗?您最终(无意中)得到了一个不是以NULL结尾的字符串,或者是一个在打印到部分缓冲区后继承其右侧发生的任何事情的整数。然而,即使初始化了缓冲区,未终止的字符串也可能以其他方式发生。

编辑(来自评论)世界末日的可能性也很小,这取决于你在做什么。

这两种情况都不可取。但是,除非完全避开动态分配的内存,否则大多数静态分配的缓冲区通常都相当小,这使得memset()相对便宜。事实上,对于动态块,它比大多数对calloc()的调用要便宜得多,后者往往大于~2k。

c99包含有关默认初始化值的语言,但是,我似乎不能让gcc -std=c99同意这一点,使用任何类型的存储。

尽管如此,由于仍在使用许多较旧的编译器(以及不太适合c99的编译器),我更倾向于只使用memset()

票数 15
EN

Stack Overflow用户

发布于 2010-05-22 01:44:20

我非常喜欢

代码语言:javascript
复制
char buffer[1024] = { 0 };

它更短,更容易阅读,更不容易出错。只在动态分配的缓冲区上使用memset,然后首选calloc

票数 13
EN

Stack Overflow用户

发布于 2010-05-22 01:46:01

当你在没有初始化的情况下定义char buffer[1024]时,你会得到未定义的数据。例如,调试模式下的可视化C++将初始化为0xcd。在释放模式下,它将简单地分配内存,而不关心上次使用的块中发生了什么。

此外,您的示例演示了运行时初始化与编译时初始化的区别。如果您的char buffer[1024] = { 0 }是一个全局或静态声明,它将与其初始化数据一起存储在二进制文件的数据段中,从而将二进制文件的大小增加约1024字节(在本例中)。如果定义在函数中,则它存储在堆栈中,并在运行时分配,而不是存储在二进制文件中。如果在这种情况下提供了一个初始化器,则初始化器存储在二进制文件中,并在运行时执行一个等效的memcpy()来初始化buffer

希望这能帮助你决定哪种方法最适合你。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2884230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档