在玩具示例中,必须使用’\ 0’进行memset

我在tutorialspoint中遇到了以下使用memset的例子:(我不熟悉C.)

#include  #include  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个字节将是垃圾 – 但这并不重要,因为我们永远不会在dest[26]处查看过去'\0'任何内容。

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

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

对程序来说, memset() 。 但是由于dest的目的是保存一个字符串 (根据定义以'\0'空字符结尾),这不是一件明智的事情。 完全合法,但不明智。

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

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

使用memset()另一个时间是分配类似指针数组的东西,这些指针可能并非全部设置为指向某些特定内容,例如更多分配的内存。

然后当将那些指针传递给’free()时the unused pointers are set to NULL, so will not cause a crash when passed to free() the unused pointers are set to NULL, so will not cause a crash when passed to