0

在 C 编程中,字符缓冲区用于字符串实现。通常我们在使用任何范围内的任何字符缓冲区之前都会清除内容。当 char 缓冲区在同一范围内多次使用时,我需要澄清如何清理 char 缓冲区。例如,在下面的函数中,我使用的是 char buffer[BUF_SIZE]。

void function foo(char *p_char)
{
 char buffer[BUF_SIZE];
 memset(buffer, '\0', BUV_SIZE-1);
 strcpy(buffer, p_char);
 ..
 ..
 // after some codes.
 strcpy(buffer, "second time use of buffer");

}

在上面的函数中,缓冲区被使用了两次,第二次我需要调用 memset() 来清除缓冲区中的先前内容吗?同样,当使用 char 缓冲区时,我是否总是在分配值之前清理它(如果值在同一范围内多次分配给缓冲区)?

4

2 回答 2

1

如果您不将缓冲区设置为空字符,则空终止符之后的字符可能是垃圾,但这通常无关紧要,因为当某些内容读取 char * 字符串时,它通常会在空终止符处停止。

于 2013-03-28T02:19:44.627 回答
1

如果您正在使用strcpy,则memset实际上不需要。从man strcpy页面可以看出

strcpy() 函数将 src 指向的字符串,包括终止的空字节 ('\0') 复制到 dest 指向的缓冲区。字符串不能重叠,并且目标字符串 dest 必须足够大以接收副本。

因为,\0也被复制了,所以你真的不需要做memset,对于strings,终止NULL \0字符表示string.

注意:如果您打算使用strncpy,请参考这个问题:为什么 strncpy 不为空终止?

于 2013-03-28T02:20:33.753 回答