memset研究

在工作上开发的时候遇到了一个关于内存的问题。

程序总是会莫名其妙的崩溃掉,后来定位到了是内存处理方面的问题,原来是memset出的错。

代码中有这样的语句,

memset(src, 0 ,512);

但是这个src指针指向的内存并没有512个字节,导致程序崩溃。

后来查资料,做测试才找到问题原因。

上面的语句在编译运行的过程总是不会产生任何警告或是错误的,程序会按照语句的意思完完全全的执行下去,不过如果在执行之后,使用src指针对这个内存释放的话就会出错了。

以下面的程序为例:


 int main(void)

{
   char *p = (char *)malloc(10);
   char *test = "this";
   memset(p, 0, 100);
   memcpy(p, test, 10);


   printf("p[99] = %d\n", p[99]);
   printf("%s\n", p);
   
   free(p);
   return 0;

}


使用GCC编译上面的代码,执行发现在执行到free的时候会导致吐核退出。

如果没有free的话,该程序可以安全无恙的执行完成。


查看出错信息,好像会比对在堆上分配的内存的新旧顶端和低端。

程序在malloc的时候,会保存分配的内存的信息,在memset的时候,会对这些信息进行修改,尤其是长度,如果在free的时候检测到这些信息不一致,程序会吐核退出。


因此在使用memset的时候,尽量将长度定义为宏来使用,如果是数组的话,可以将长度设置为sizeof(array),总之尽量不要使用具体数值。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值