关于free 函数操作问题
2017-08-18 16:00
204 查看
为准确了解free函数,让我们看看malloc申请动态内存和free函数被调用时,内存做了哪些工作:
申请40个字节的内存块大小为28,在被申请内存块首地址的16字节之前被写入;
调用free函数后,之前申请的内存块被覆盖;
接着申请10个字节大小的内存块,转成16进制为0a,在内存块首地址的16字节之前被写入到内存里;
使用free函数释放内存时,函数在内存块首地址之前16个字节处找到内存块的大小。
因此若被free的为一个空指针是没有任何意义的,编译器也不会报错。
申请字符串函数,初始化遇到问题
由于未初始化的指针自动初始化为0xcccccccc或0xcdcdcdcd,而不是取随机值,使用strcpy函数,可以进行正确的初始化。
如果内存不够的情况,函数库为我们提供了另一个函数realloc,
int main()
{
int *p = (int*)malloc(10*sizeof(int));
for(int i=0; i<10; i++)
{
p[i]=i;
}
int tmp = 0;
p = (int*)realloc(p,100*sizeof(int));
for(int i=0; i<20; i++)
{
p[i]=i;
}
tmp = 1;
p = (int*)realloc(p,5*sizeof(int));
for(int i=0; i<5; i++)
{
p[i]=i;
}
return 0;
}
监视p 的地址为
动态申请长度为40字节的内存
使用realloc函数,得到长度为400字节的内存,p的地址仍为
调用realloc函数,得到新的长度为20字节的内存,p的地址为
本次测试realloc函数申请更大或更小内存,指针的位置均为发生改变,原来的内存已经被覆盖。
参考文献:
free函数是如何确定要释放多少内存空间的
http://www.cnblogs.com/xxNote/p/4009359.html
int main() { int *arr=(int*)malloc(10*sizeof(int)); arr[0] = 100; arr[1] = 200; free(arr); arr = NULL; char src[]={"shit man"}; char *str = (char*)malloc(10); strcpy(str,src); free(str); str = NULL; return 0; }
申请40个字节的内存块大小为28,在被申请内存块首地址的16字节之前被写入;
调用free函数后,之前申请的内存块被覆盖;
接着申请10个字节大小的内存块,转成16进制为0a,在内存块首地址的16字节之前被写入到内存里;
使用free函数释放内存时,函数在内存块首地址之前16个字节处找到内存块的大小。
因此若被free的为一个空指针是没有任何意义的,编译器也不会报错。
申请字符串函数,初始化遇到问题
char* ArrChar() { char *arr = (char*)malloc(10*sizeof(char)); return arr; } int main() { char *p=ArrChar(); free(p); return 0; }
由于未初始化的指针自动初始化为0xcccccccc或0xcdcdcdcd,而不是取随机值,使用strcpy函数,可以进行正确的初始化。
如果内存不够的情况,函数库为我们提供了另一个函数realloc,
int main()
{
int *p = (int*)malloc(10*sizeof(int));
for(int i=0; i<10; i++)
{
p[i]=i;
}
int tmp = 0;
p = (int*)realloc(p,100*sizeof(int));
for(int i=0; i<20; i++)
{
p[i]=i;
}
tmp = 1;
p = (int*)realloc(p,5*sizeof(int));
for(int i=0; i<5; i++)
{
p[i]=i;
}
return 0;
}
监视p 的地址为
动态申请长度为40字节的内存
使用realloc函数,得到长度为400字节的内存,p的地址仍为
调用realloc函数,得到新的长度为20字节的内存,p的地址为
本次测试realloc函数申请更大或更小内存,指针的位置均为发生改变,原来的内存已经被覆盖。
参考文献:
free函数是如何确定要释放多少内存空间的
http://www.cnblogs.com/xxNote/p/4009359.html
相关文章推荐
- 关于ThinkPHP5.0*的软删除delete_time的引用和部分时间函数where(),whereTime()连贯操作的问题
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 关于malloc()函数以及free()报heap buffer错误的问题
- 关于使用ODBC+VC操作DBF文件问题小结
- 关于WebForm下操作excel打印的棘手的问题!
- MS05-043漏洞利用分析以及ntdll!RtlFreeHeap中关于lookaside链表的操作
- 有关于c#操作excel的问题 请各位大虾指教
- 字符集问题的初步探讨(七)----关于字符集更改的内部操作
- 关于登录进去后不能操作问题的回复
- Linux内核中关于数据结构操作的一个问题
- 关于指针操作问题
- JAVA与C++::关于JNI中文字符串操作问题总结
- 关于PHP中操作MySQL数据库的一些要注意的问题
- 关于PHP中操作MySQL数据库的一些要注意的问题
- 关于子函数返回字符串的问题解决办法
- 关于函数返回的局部数组的问题
- 关于在ASP.NET中以DCOM方式操作Excel的几个问题
- 『EXP2』关于在函数内部分配内存时需要注意的问题
- 关于登录进去后不能操作问题的回复
- [求助]关于eclipse下开发串口操作插件的问题