memset研究

来源:互联网 发布:北京程序员工资水平 编辑:程序博客网 时间:2024/06/10 17:48

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

程序总是会莫名其妙的崩溃掉,后来定位到了是内存处理方面的问题,原来是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),总之尽量不要使用具体数值。



原创粉丝点击