gcc 4.4.4 C89
我只是想知道大多数C程序员在想将内存清零时会做什么。
例如,我有一个1024字节的缓冲区。有时我这样做:
char buffer[1024] = {0};
它将所有字节清零。
但是,我应该这样声明并使用memset吗?
char buffer[1024];
.
.
memset(buffer, 0, sizeof(buffer));
您是否有任何真正原因需要将内存清零?不这样做会导致最严重的后果?
最佳答案
可能发生的最坏情况?您最终(不知不觉地)得到了一个不以NULL结尾的字符串,或者是一个整数,该整数继承了在打印到缓冲区的一部分之后碰巧在它右边的所有内容。但是,即使您初始化了缓冲区,未终止的字符串也可以通过其他方式发生。
编辑(根据评论)世界末日的可能性也很小,这取决于您在做什么。
两者都不可取。但是,除非完全避开动态分配的内存,否则大多数静态分配的缓冲区通常都很小,这使得memset()
相对便宜。实际上,它比动态块的大多数calloc()
调用便宜得多,后者通常大于〜2k。
c99包含有关默认初始化值的语言,但是,我似乎无法使用任何类型的存储使gcc -std=c99
与之一致。
不过,由于仍然有许多较旧的编译器(以及不是C99的编译器)仍在使用,我更喜欢仅使用memset()