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

The necessity to memset with '\0', in a toy example

我在tutorialspoint中遇到了以下使用memset的例子:

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

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

    memset(dest, '[=10=]', 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 };

但其中 none 是必需的,因为 dest 在使用前已分配了一个值。

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

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

如果没有 memset() 调用,dest 的剩余 73 个字节将是垃圾——但这无关紧要,因为我们从不查看 '[=25=]' 之后的任何内容dest[26].

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

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

到程序,那么 memset() 就很重要了。但是由于 dest 的目的是保存一个 string (根据定义,它由 '[=25=]' 空字符终止),这不是一件明智的事情去做。完全合法,但不明智。

发布的代码可以通过 memset() 跳过初始化。

它真正有用的时候是在调试时使用调试器显示变量的内容。

另一个使用 memset() 的时间是分配诸如指针数组之类的东西时,这些东西可能不会全部设置为指向特定的东西,比如分配更多的内存。

然后将这些指针传递给'free()the unused pointers are set to NULL, so will not cause a crash when passed tofree()`