memset()函数

时间:2011-01-23 15:14:18

标签: c++

我是C / C ++的初学者,我遇到了以下代码段:

#define MAX_MSG 1000
char *szBuf = new char[MAX_MSG];
char *szBufRaw = new char[MAX_MSG];
memset(szBuf, ‘\0’, strlen(szBuf));
memset(szBufRaw, ‘\0’, strlen(szBufRaw));

我在这里阅读了关于memset的教程:

http://www.java-samples.com/showtutorial.php?tutorialid=591

我相信上面的代码是正确的,但代码的原始作者认为其中有一个错误,任何人都可以给我一个提示吗? 提前谢谢。

8 个答案:

答案 0 :(得分:6)

strlen(szBuf)(和strlen(szBufRaw))仅在有效字符串上返回正确的结果。您应该改为MAX_MSG

答案 1 :(得分:6)

strlen()查找数组中的第一个空值,这意味着您不会在内存中设置正确的字节数。

使用MAX_MSG代替将整个数组设置为null。

答案 2 :(得分:3)

两个char数组都未初始化,对它们使用strlen()是未定义的行为。它不会做你期望的。

strlen()遍历字符串,给定指向其第一个字符的指针,并返回字符串的长度,即直到找到终止零。使用new创建这些数组后,它们不包含任何有意义的内容。这些调用可能会返回任何内容,甚至可能导致程序崩溃。

你想要的是传递数组的大小:

memset(szBuf, ‘\0’, MAX_MSG);
memset(szBufRaw, ‘\0’, MAX_MSG);

答案 3 :(得分:3)

strlen()返回给定字符串的长度 长度定义为头部和尾部之间的长度,其值为\0

在上面的代码中,strlen()不一定会返回MAX_MSG,因为您尚未初始化或设置某个值。

memset(szBuf, ‘\0’, sizeof(szBuf))

会奏效。

答案 4 :(得分:1)

strlen将不会按预期运行,因为它计算NUL(0 ascii代码)char之前的字节数。你需要的是传递MAX_MSG而不是strlen。顺便问一下,这是家庭作业吗?

答案 5 :(得分:0)

在致电memset之前,两个缓冲区szBufszBufRaw未初始化。但是,为了清除内存的长度,代码会在其上调用strlen。这不起作用,因为缓冲区不包含有效的字符串。代码应该清除缓冲区中的MAX_MSG个字节,而不是使用strlen

答案 6 :(得分:0)

  

memset(szBuf, ‘\0’, strlen(szBuf));

那里有strlen()做什么?字符串在哪里?

strlen()函数返回终止null之前的字符数 C样式字符串中的字符。

memset(szBuf, ‘\0’, MAX_MSG);应该有用。

答案 7 :(得分:0)

new分配的未初始化内存与strlen()的效果不佳。

如果有人写的话会更好:

memset(szBuf, 0, MAX_MSG * sizeof *szBuf);

您也可以跳过sizeof *szBuf,因为它保证为1,但不会受到伤害。