http://blog.youkuaiyun.com/wyb041011/article/details/36908811
在使用memset()函数初始化内存空间是,代码如下:
- int main(void)
- {
- char *pBuf =0;
- if(!(pBuf=(char*)malloc(sizeof(char)*100+1)))
- {
- //show error information.
- exit(1);
- };
- memset(pBuf, 0, strlen(pBuf));
- free(pBuf);
- return 0;
- }
在vs2010下按F5启动调试,报错如下:
Windows 已在 Test.exe 中触发一个断点。
其原因可能是堆被损坏,这说明 Test.exe 中或它所加载的任何 DLL 中有 Bug。
原因也可能是用户在 Test.exe 具有焦点时按下了 F12。
输出窗口可能提供了更多诊断信息。
- memset(pBuf, 0, strlen(pBuf));
原本想通过strlen(pBuf);获取pBuf字符串的长度,但事与愿违,strlen(pBuf)=105,由此可知运行时报错是正常的。
因此,strlen只关心存储的数据内容,不关心空间的大小和类型。事实上,strlen(pBuf)输出结果105实际上每次运行可能不一样,这取决于pBuf里面存了什么(从pBuf[0]开始直到遇到第一个'\0'结束);
Strlen函数说明
strlen(...)是函数,要在运行时才能计算。
参数必须是字符型指针(char*), 且必须是以'\0'结尾的。当数组名作为参数传入时,实际上数组就退化成指针了。
int ac[10];
cout<<sizeof(ac)<<endl;
cout<<strlen(ac)<<endl; (ac相当于一个指针,但是strlen只能接受char*类型,所以编译时出错)
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符'\0'。返回的长度大小不包括'\0'。