国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

經典的動態內存錯誤(上)

shadajin / 1699人閱讀

摘要:二內存錯誤的類型未判斷動態內存函數的返回值造成非法訪問申請個類型的空間也可以寫成在此之前未進行返回值判斷,如果是返回值是申請失敗返回的是非法訪問的因為的的地址是隨機的未定的。

目錄

一、前言

二、內存錯誤的類型

??1.未判斷動態內存函數的返回值造成非法訪問

??2.賦值的數大于申請的內存空間造成的越界訪問

??3.free函數未完全釋放


一、前言

? ? ? ?我們在使用動態內存函數申請內存空間時,需要注意許多細節如函數的返回值,

所申請空間的釋放等等,我們要是忽略這些細節就容易造成程序崩潰、內存泄漏、

非法訪問等等一些程序問題。

二、內存錯誤的類型

1.未判斷動態內存函數的返回值造成非法訪問

#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直接退出函數           }

2.賦值的數大于申請的內存空間造成的越界訪問

#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; }

? 下圖時非法訪問的報錯,雖然賦值了,但是呢那塊空間本不屬于我們的,但我們強行賦值,

? 故造成非法訪問,所以我們在寫代碼時要格外注意申請的大小和使用的多少,

? ? 前者須大于等于后者

?3.free函數未完全釋放

主要原因是返回的的指針不在指向初始位置,或者說指針已經發生了變化

#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;}

寫作不易,記得支持一下,歡迎各位大佬斧正

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119404.html

相關文章

發表評論

0條評論

shadajin

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<