c - 在玩具示例中使用 '\0' 进行 memset 的必要性

标签 c memset

我在tutorialspoint中遇到了下面这个使用memset的例子:

#include <stdio.h>
#include <string.h>

int main(){
    char src[40];
    char dest[100];

    memset(dest, '\0', sizeof(dest));
    strcpy(src, "This is tutorialspoint.com");
    strcpy(dest, src);

    printf("Final copied string : %s\n", dest);

    return(0);
}

我不明白为什么要使用 memset 行,因为注释该行时编译和结果是相同的。我想问一下,那条线是必须的吗?或者在执行 strcpy() 时这样做是一种好习惯吗?或者它只是一根随机线。

谢谢!

最佳答案

在这种情况下不需要它,因为它对输出没有影响。在一些类似的情况下可能需要它。

char dest[100];

这将 dest 定义为 100 个 char 的本地数组。它的初始值是垃圾。它可以写成:

char dest[100] = "";

char dest[100] = { 0 };

但这些都不是必需的,因为 dest 在使用之前已分配了一个值。

strcpy(src, "This is tutorialspoint.com");
strcpy(dest, src);

这会将包含在 src 中的字符串复制到数组 dest 中。它复制 "This is tutorialspoint.com" 的 26 个字符加上 1 个附加字符,终止符 '\0; 标记字符串的结尾。 dest 数组的先前内容将被忽略。 (如果我们使用 strcat(),这很重要,因为 strcat() 之前必须在目标中找到 '\0'它可以开始复制。)

如果没有 memset() 调用,dest 的剩余 73 个字节将是垃圾——但这无关紧要,因为我们从不查看超出'\0' 位于 dest[26]

如果出于某种原因,我们决定添加如下内容:

printf("dest[99] = '%c'\n", dest[99]);

程序,那么 memset() 就很重要了。但是由于 dest 的目的是保存一个 string(根据定义,它由一个 '\0' 空字符终止),那将这不是明智之举。完全合法,但不明智。

关于c - 在玩具示例中使用 '\0' 进行 memset 的必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36901038/

相关文章:

c - 我不知道另外 1 个来自哪里

c - 在 C 中拆分数组

c - 使用 memset 时,数组未正确重置

c++ - 为什么 memset 在二维数组中正确填充 0 但无法在该数组中填充 1?

c - memset() 对 va_list 的含义是什么?

c - LVM_GETITEM 困惑

c - 如何在 C 上打印 "\"

c - ‘RSA_SSLV23_PADDING’ 未声明(首次在此函数中使用);你是说 ‘RSA_NO_PADDING’ 吗?使用 asdf 编译 ruby​​-2.7.1 时

jquery - jQuery 中的 C++ memset() 等价物

c - gdb - 如何为指针数组调用 memset