我是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
我相信上面的代码是正确的,但代码的原始作者认为其中有一个错误,任何人都可以给我一个提示吗? 提前谢谢。
答案 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
之前,两个缓冲区szBuf
和szBufRaw
未初始化。但是,为了清除内存的长度,代码会在其上调用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,但不会受到伤害。