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),总之尽量不要使用具体数值。
- memset研究
- memset
- memset
- memset
- memset
- memset
- memset
- memset
- memset
- memset
- memset
- memset
- memset
- memset
- memset
- memset
- memset
- memset
- sprintf用法解析
- (转)C++中extern “C”含义深层探索
- 关于Linux下如何安装Netbeans和JDK的方法
- 【算法】快速排序【JS实现】
- 为什么很多空间这么便宜,你又了解多少呢?
- memset研究
- 算数运算符i++;++i;
- poj 1459 Power Network 初级->图算法->最大流(基本算法:增广路)
- amqp0_9_1文档中定义的连接过程
- 如何评价一个网站的好坏
- 黑马程序员 数组的基本操作代码
- STL实用入门教程、COM实用入门教程
- hdu 3692 Shade of Hallelujah Mountain
- 2012写在同里