C学习笔记--memset注意事项

本文详细解析了在C/C++中使用memset初始化内存时常见的错误,特别是与strlen函数结合使用时的问题。通过一个具体的示例代码,展示了如何避免因错误使用strlen而导致的内存访问异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/wyb041011/article/details/36908811

在使用memset()函数初始化内存空间是,代码如下:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int main(void)  
  2. {  
  3.     char *pBuf =0;  
  4.     if(!(pBuf=(char*)malloc(sizeof(char)*100+1)))  
  5.     {  
  6.         //show error information.  
  7.         exit(1);  
  8.     };  
  9.     memset(pBuf, 0, strlen(pBuf));  
  10.     free(pBuf);  
  11.     return 0;  
  12. }  

在vs2010下按F5启动调试,报错如下:

Windows 已在 Test.exe 中触发一个断点。


其原因可能是堆被损坏,这说明 Test.exe 中或它所加载的任何 DLL 中有 Bug。


原因也可能是用户在 Test.exe 具有焦点时按下了 F12。


输出窗口可能提供了更多诊断信息。


运行报错,原因在于
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 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'。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值