摘要:二內(nèi)存錯(cuò)誤的類型未判斷動(dòng)態(tài)內(nèi)存函數(shù)的返回值造成非法訪問申請(qǐng)個(gè)類型的空間也可以寫成在此之前未進(jìn)行返回值判斷,如果是返回值是申請(qǐng)失敗返回的是非法訪問的因?yàn)榈牡牡刂肥请S機(jī)的未定的。
目錄
??1.未判斷動(dòng)態(tài)內(nèi)存函數(shù)的返回值造成非法訪問
??2.賦值的數(shù)大于申請(qǐng)的內(nèi)存空間造成的越界訪問
? ? ? ?我們?cè)谑褂脛?dòng)態(tài)內(nèi)存函數(shù)申請(qǐng)內(nèi)存空間時(shí),需要注意許多細(xì)節(jié)如函數(shù)的返回值,
所申請(qǐng)空間的釋放等等,我們要是忽略這些細(xì)節(jié)就容易造成程序崩潰、內(nèi)存泄漏、
非法訪問等等一些程序問題。
#include#include#includeint main(){ int *p=(*int)malloc(10*sizeof(int));//申請(qǐng)10個(gè)int類型的空間也可以寫成malloc(40) for(int i=0;i<10;i++)//在此之前未進(jìn)行返回值判斷,如果是返回值是NULL(申請(qǐng)失敗返回的),*NULL是 // 非法訪問的因?yàn)镹ULL的的地址是隨機(jī)的未定的。 { int kc=*(p+i)=i;//賦值 printf("%d ",kc);//賦值一個(gè)打印一個(gè) } free(p); p=NULL; system("pause");//暫停 return 0;}
所以使用動(dòng)態(tài)內(nèi)存函數(shù)時(shí)應(yīng)該先判斷為非空指針才可以進(jìn)行后續(xù)一系列操作
判斷方法是
//加個(gè)if(*p!=NULL) { //要執(zhí)行的語句 } else { return 0;//為NULL直接退出函數(shù) }
#include#includeint main() { char* pp=(char*)calloc(5,sizeof(char));//申請(qǐng)5個(gè)char類型的內(nèi)存空間 if(pp!=NULL) { for(int i=0;i<=5;i++)//賦值了6個(gè)元素分別是0、1、2、3、4、5動(dòng)態(tài)函數(shù)只申請(qǐng)了5個(gè) // 剩余一個(gè)已經(jīng)越界訪問了。 { int yy =*(pp+i)=i; printf("%d ",yy); } } else { return 0;//為空直接退出函數(shù) } free(pp);//老規(guī)矩,釋放申請(qǐng)的地址,下面那個(gè)給你們說 pp=NULL; system("pause"); return 0; }
? 下圖時(shí)非法訪問的報(bào)錯(cuò),雖然賦值了,但是呢那塊空間本不屬于我們的,但我們強(qiáng)行賦值,
? 故造成非法訪問,所以我們在寫代碼時(shí)要格外注意申請(qǐng)的大小和使用的多少,
? ? 前者須大于等于后者
主要原因是返回的的指針不在指向初始位置,或者說指針已經(jīng)發(fā)生了變化
#include#includeint main(){ int* ptr=(int*)malloc(10*sizeof(int));//你們應(yīng)該很熟了,我這里就不全部注釋了 if(ptr!=NULL) { for(int i=0;i<10;i++) { int nb=*ptr++=i;//ptr結(jié)束后指向最后一個(gè)元素 printf("%d ",nb); } } free(ptr);//此時(shí)ptr已經(jīng)不再指向初始位置了,導(dǎo)致free不能完全釋放(釋放了,但沒完全釋放哈哈) ptr=NULL; return 0;}
以下是出錯(cuò)報(bào)的警告(未完全釋放會(huì)導(dǎo)致內(nèi)存泄漏)
?改正這個(gè)錯(cuò)誤其實(shí)不難,因?yàn)樗遣挥浀迷瓉淼氖椎刂?,所以我們只需要在他改變之前存?/span>
首地址如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;}
寫作不易,記得支持一下,歡迎各位大佬斧正
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/119404.html
摘要:如果開辟失敗,則返回一個(gè)指針,因此的返回值一定要做檢查。函數(shù)用來釋放動(dòng)態(tài)開辟的內(nèi)存。 目錄 一、動(dòng)態(tài)內(nèi)存分配1、為什么存在動(dòng)態(tài)內(nèi)存分配 二、malloc1、m...
摘要:結(jié)尾有關(guān)這四道經(jīng)典的指針筆試題講解就到此結(jié)束了,如果覺得文章對(duì)自己有所幫助,歡迎大家多多點(diǎn)贊收藏 ?前言 : 今天博主來講解4道經(jīng)典的指針筆試題,很多朋友沒有深刻理...
閱讀 2622·2021-09-22 15:25
閱讀 3039·2021-09-14 18:03
閱讀 1308·2021-09-09 09:33
閱讀 1775·2021-09-07 09:59
閱讀 3002·2021-07-29 13:50
閱讀 1559·2019-08-30 15:44
閱讀 1775·2019-08-29 16:22
閱讀 1348·2019-08-29 12:49