将第一个字节设置为0或使用memset“重置”整个缓冲区

时间:2010-07-09 00:41:15

标签: c

在C编程中,每当我尝试第一次执行cat时,我都需要

TCHAR file_name[1024];
// Use memset or set the first byte to 0?
file_name[0] = 0;
_tcscat(file_name, TEMP_DIRECTORY_PATH);
_tcscat(file_name, file);

我看到大多数程序员都在使用memset。但是,对我来说,我只是将第一个字节设置为0,让_tcscat知道从哪里开始。

我不确定是否有任何缺点/陷阱,而不是使用memset?

感谢。

4 个答案:

答案 0 :(得分:4)

我不同意大多数答案似乎表明将整个缓冲区设置为0可能会有所帮助。如果你正在将以空值终止的字符串复制/连接到缓冲区中,则无需清除整个内容 - 在我看来这是浪费(尽管它可能是一种浪费,不值得担心)。

您可以采用Artelius suggested的方法并使用strcpy()变量将初始字符串放入缓冲区,但我认为使用 strcat()的方法的对称性也有价值(虽然我认为只将第一个字符设置为0就足够了。)

顺便说一句,如果缓冲区可能包含'sensitve'数据(密码信息或其他内容) - 这可能是清除整个事情的理由。但如果是这种情况,请查看http://msdn.microsoft.com/en-us/library/ms972826,了解memset()可能不够的原因。

答案 1 :(得分:3)

可以将第一个字符设置为0。

然而,更简单的方法是

TCHAR file_name[1024];
_tcsncpy(file_name, TEMP_DIRECTORY_PATH, 1024);
_tcscat(file_name, file);

答案 2 :(得分:1)

没有,除了将所有内容设置为空值之外,可以在以后防止错误,即如果由于某种原因不添加错误。用零填充整个字符串更容易,并且知道您不必担心以后手动添加空终止符,只要不溢出缓冲区。

答案 3 :(得分:1)

将整个缓冲区设置为NUL字符是“深度防御”。这样的防御包括源代码中其他地方的错误,也许是由不同的程序员。在这种情况下,防止的错误是复制一个适合缓冲区的字符串,但不复制NUL终止字节。已经为零的缓冲区将为这个错误的字符串副本提供终止NUL以“使用”。程序员对“深度防御”的智慧不同,因为这样的编码可以掩盖编程错误,这些编程错误随后会在源代码中恶化 - 只有在它们被引入后才会被修复。

在我个人看来,将缓冲区设置为这样的所有NUL字符作为“深度防御”是一个巨大的浪费。只有NUL的最后一个字节才更有意义。然后会出现错误,但最终会终止字符串。一旦你开始沿着这条思路走下去,“深度防御”会更有意义,如果缓冲区的两个机器字更长,并且这些字被排除在外,并且可能的金丝雀值可能会报告超出缓冲区,.... -

或者你可能不会超出缓冲区,编写你的程序,以便在你这样做时尽快崩溃。这就是我喜欢做的事情。