malloc和free(2)——malloc()申请内存得到指针,指针被改动,用free释放内存报错
2017-12-06 14:55
656 查看
malloc()分配内存,得到的内存指针,中间经过了改动,再调用free释放内存出现问题
Parr1D1 = data;
这一行代码写的很差,首先就是这个地方确实改变了指针Parr1D1,Parr1D1本身的值变化了。delete(或者free)时就会出现无效指针的错误。
至少给数组赋值应该用memcpy或snprintf函数来做。
注意下面这句从来没有被执行
cout<<"GoodBye main()"<<endl;
图一
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/18/240f3c5e237452c4849d5f1e16a2f4fd)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/18/05acf30c113a9cda3c41163782784e60)
图二
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/18/58b7ac0e6f536d9dd9698ce3571205da)
图三
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/18/03c29b3a0ec01a0f21c615ef11cdc103)
图四
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/18/f84c8342cf6bb0c1c55fe59109e22f38)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/18/5f5bcf55c90d6a070763a0ec7d1d0da2)
参考: http://blog.csdn.net/xiamo20149/article/details/51964945
Parr1D1 = data;
这一行代码写的很差,首先就是这个地方确实改变了指针Parr1D1,Parr1D1本身的值变化了。delete(或者free)时就会出现无效指针的错误。
至少给数组赋值应该用memcpy或snprintf函数来做。
Parr1D1 = data; //以下两个cout都注释掉,报错见图一 free(): invalid size: 0x00007ffc98a56080 *** //只注释掉第一个,报错见图二 卡住不执行下面的语句 //只注释掉第二个,报错见图三 卡住不执行下面的语句 //两个都不注释,报错见图四 double free or corruption (out): 0x00007ffd66a91210 *** cout<<"data address: "<<data<<endl; cout<<"Parr1D1 pointer address After(Parr1D1 = data;): "<<Parr1D1<<endl; free(Parr1D1);
注意下面这句从来没有被执行
cout<<"GoodBye main()"<<endl;
#include <typeinfo> #include<stdlib.h> //malloc()头文件 #include<iostream> using namespace std; //数组指针 int main() { cout<<"Hello main()"<<endl; int len = 10; //声明时候赋值NULL double *Parr1D1 = NULL; cout<<"Parr1D1 pointer address Before malloc: "<<Parr1D1<<endl; //Parr1D1的值是一个指针,顺着这个指针可以从内存中找到数据 Parr1D1 = (double*)malloc(len*sizeof(double));//从此指针知道自己所指向的内存的地址 cout<<"Parr1D1 pointer address After malloc: "<<Parr1D1<<endl; //Parr1D1的值是一个指针,顺着这个指针可以从内存中找到数据 ///////////////////////////////////////////// double data[len]; cout<<endl<<"data[i]: "; //data是数组名字: 只能通过数组名字加下标的方式访问数组 for(int i=0; i<len; i++) { data[i] = i; cout<<data[i]<<" "; } cout<<endl; ///////////////////////////////////////////// //Parr1D1 = &data; 会报错: a value of type "double (*)[len]" cannot be assigned to an entity of type "double *" //这两个语句是等效的: Parr1D1 = &data; 和 Parr1D1 = (double *)&data; Parr1D1 = data; //以下两个cout都注释掉,报错见图一 free(): invalid size: 0x00007ffc98a56080 *** //只注释掉第一个,报错见图二 卡住不执行下面的语句 //只注释掉第二个,报错见图三 卡住不执行下面的语句 //两个都不注释,报错见图四 double free or corruption (out): 0x00007ffd66a91210 *** //cout<<"data address: "<<data<<endl; cout<<"Parr1D1 pointer address After(Parr1D1 = data;): "<<Parr1D1<<endl; free(Parr1D1); cout<<"GoodBye main()"<<endl; return 0; }
图一
图二
图三
图四
参考: http://blog.csdn.net/xiamo20149/article/details/51964945
相关文章推荐
- malloc和free(1)——malloc()申请内存得到指针,指针没有改变,用free()释放内存,不会报错
- malloc和free(3)——malloc()申请内存得到指针,通过memcpy()拷贝数据到指针所指内存,指针没有改变,调用free()释放内存不会报错
- c语言多级指针用malloc申请内存,释放报错,为什么会这样捏???????
- 陈正冲老师讲c语言之内存的申请malloc() 和释放free()
- c语言之内存的申请malloc() 和释放free()
- C 笔记 free()释放一个非malloc() 申请的内存
- malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存
- 陈正冲老师讲c语言之内存的申请malloc() 和释放free()
- malloc,free动态申请释放内存机制
- 有关于malloc申请内存和free内存释放
- 陈正冲老师讲c语言之内存的申请malloc() 和释放free()
- 指针申请内存和释放
- C语言中多维数组的内存分配和释放(malloc与free)
- 数组内存申请和释放,指针数组和数组指针
- C语言中多维数组的内存分配和释放(malloc与free)的方法
- C语言学习8:malloc返回的void*类型指针不可以做更改,free双重释放,二维数组的初始化和打印,a和a[0]和a[0][0]的区别,数组指针(*p)[3],指针数组*a[10],动态内存分配版约瑟夫环,动态分配版去空格和逗号处理,二级指针与二维数组互用
- C与C++中内存分配释放-malloc,free,new,delete
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 关于指针和数组对申请内存malloc和作为参数传递的一些问题
- C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存