摘要:二内存错误的类型未判断动态内存函数的返回值造成非法访问申请个类型的空间也可以写成在此之前未进行返回值判断,如果是返回值是申请失败返回的是非法访问的因为的的地址是随机的未定的。
目录
我们在使用动态内存函数申请内存空间时,需要注意许多细节如函数的返回值,
所申请空间的释放等等,我们要是忽略这些细节就容易造成程序崩溃、内存泄漏、
非法访问等等一些程序问题。
#include#include#includeint main(){ int *p=(*int)malloc(10*sizeof(int));//申请10个int类型的空间也可以写成malloc(40) for(int i=0;i<10;i++)//在此之前未进行返回值判断,如果是返回值是NULL(申请失败返回的),*NULL是 // 非法访问的因为NULL的的地址是随机的未定的。 { int kc=*(p+i)=i;//赋值 printf("%d ",kc);//赋值一个打印一个 } free(p); p=NULL; system("pause");//暂停 return 0;}
所以使用动态内存函数时应该先判断为非空指针才可以进行后续一系列操作
判断方法是
//加个if(*p!=NULL) { //要执行的语句 } else { return 0;//为NULL直接退出函数 }
#include#includeint main() { char* pp=(char*)calloc(5,sizeof(char));//申请5个char类型的内存空间 if(pp!=NULL) { for(int i=0;i<=5;i++)//赋值了6个元素分别是0、1、2、3、4、5动态函数只申请了5个 // 剩余一个已经越界访问了。 { int yy =*(pp+i)=i; printf("%d ",yy); } } else { return 0;//为空直接退出函数 } free(pp);//老规矩,释放申请的地址,下面那个给你们说 pp=NULL; system("pause"); return 0; }
下图时非法访问的报错,虽然赋值了,但是呢那块空间本不属于我们的,但我们强行赋值,
故造成非法访问,所以我们在写代码时要格外注意申请的大小和使用的多少,
前者须大于等于后者
主要原因是返回的的指针不在指向初始位置,或者说指针已经发生了变化
#include#includeint main(){ int* ptr=(int*)malloc(10*sizeof(int));//你们应该很熟了,我这里就不全部注释了 if(ptr!=NULL) { for(int i=0;i<10;i++) { int nb=*ptr++=i;//ptr结束后指向最后一个元素 printf("%d ",nb); } } free(ptr);//此时ptr已经不再指向初始位置了,导致free不能完全释放(释放了,但没完全释放哈哈) ptr=NULL; return 0;}
以下是出错报的警告(未完全释放会导致内存泄漏)
改正这个错误其实不难,因为他是不记得原来的首地址,所以我们只需要在他改变之前存下
首地址如int* ret=ptr然后释放ret就可以了.
具体如下:
#include#includeint main(){ int* ptr = (int*)malloc(10 * sizeof(int)); int *ret = ptr; if (ptr != NULL) { for (int i = 0; i<10; i++) { int nb = *ptr++ = i; printf("%d ", nb); } } free(ret); ret=NULL; system("pause"); return 0;}
写作不易,记得支持一下,欢迎各位大佬斧正
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/119404.html
摘要:如果开辟失败,则返回一个指针,因此的返回值一定要做检查。函数用来释放动态开辟的内存。 目录 一、动态内存分配1、为什么存在动态内存分配 二、malloc1、m...
摘要:结尾有关这四道经典的指针笔试题讲解就到此结束了,如果觉得文章对自己有所帮助,欢迎大家多多点赞收藏 ?前言 : 今天博主来讲解4道经典的指针笔试题,很多朋友没有深刻理...
阅读 2537·2021-09-22 15:25
阅读 2943·2021-09-14 18:03
阅读 1168·2021-09-09 09:33
阅读 1680·2021-09-07 09:59
阅读 2875·2021-07-29 13:50
阅读 1481·2019-08-30 15:44
阅读 1692·2019-08-29 16:22
阅读 1269·2019-08-29 12:49