在玩具示例中使用 '\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 to
free()`
我在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 to
free()`