【问题标题】:Clarification for use of char buffers when char buffer is using several times within the same scope in CC 中同一范围内多次使用 char 缓冲区时使用 char 缓冲区的说明
【发布时间】:2013-03-18 08:59:52
【问题描述】:

在 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 缓冲区时,我是否总是在分配值之前清理它(如果值在同一范围内多次分配给缓冲区)?

【问题讨论】:

  • 我不知道“我们”是谁,但在使用char[] 之前,我不会“习惯性地清除内容”。实际上,如果只是字符串,我不知道我曾经这样做过。

标签: c char memset


【解决方案1】:

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

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

由于\0也被复制了,所以memset并不需要,至于stringsNULL \0结束符表示string的结束。

注意:如果您打算使用strncpy,请参考这个问题:Why does strncpy not null terminate?

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-05-27
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      相关资源
      最近更新 更多