亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言之free函數以及野指針介紹

2020-01-26 16:00:13
字體:
來源:轉載
供稿:網友

【FROM MSDN && 百科】
原型:void free(void *ptr);
#include<stdlib.h>或#include <malloc.h>
Deallocate space in memory
釋放ptr指向的存儲空間。被釋放的空間通常被送入可用存儲區池,以后可在調用malloc、realloc以及realloc函數來再分配。
注意:連續兩次使用free函數,肯定會發生錯誤。malloc的次數要和free的次數相等。
A block of memory previously allocated using a call to malloc, calloc or realloc is deallocated, making it available again for further allocations.
If ptr does not point to a block of memory allocated with the above functions, the behavior is undefined.
If ptr is a null pointer, the function does nothing
Notice that this function does not change the value of ptr itself, hence it still points to the same (now invalid) location
DEMO:

復制代碼 代碼如下:

//#define  FIRST_DEMO
#define  SECOND_DEMO
#ifdef FIRST_DEMO
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(void)
{
 int *buffer1,*buffer2,*buffer3;
 buffer1=(int *)malloc(100*sizeof(int));
 buffer2=(int *)calloc(100,sizeof(int));
 buffer3=(int *)realloc(buffer2,500*sizeof(int));
 free(buffer1);
 free(buffer3);
 getch();
 return 0;
}
#elif defined SECOND_DEMO
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(void)
{
 char *str;
 /*allocate memory for string*/
 str=(char *)malloc(10);
 if (str==NULL)
 {
  perror("malloc");
  abort();
 }
 else
 {
  /*copy "hello" to string*/
  strcpy(str,"hello");
  /*display string*/
  printf("String is %s/n",str);
  /*free memory*/
  free(str);
 }
 getch();
 return 0;
}
#endif

DEMO:perror
perror( ) 用來將上一個函數發生錯誤的原因輸出到標準設備(stderr)。參數 s 所指的字符串會先打印出,后面再加上錯誤原因字符串。此錯誤原因依照全局變量errno 的值來決定要輸出的字符串。
復制代碼 代碼如下:

#include <stdio.h>
#include <stdlib.h>   //perror包含在此文件中
#include <conio.h>
int main(void)
{
    FILE *fp;
 fp=fopen("abc","r+");
 if (NULL == fp)
 {
  perror("abc");
 }
 getch();
 return 0;
}

output:
abc: No such file or directory
DEMO:
復制代碼 代碼如下:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
 char *ptr;
 ptr=(char *)malloc(100);
 strcpy(ptr,"Hello");
 free(ptr);    //<span style="font-family: arial, 宋體, sans-serif; font-size: 13.63636302947998px; line-height: 24px; text-indent: 30px;"> ptr 所指的內存被釋放,但是ptr所指的地址仍然不變,原來的內存變為“垃圾”內存(不可用內存)</span>
#if 1
 if (ptr!=NULL)    /*<span style="font-family: arial, 宋體, sans-serif; font-size: 13.63636302947998px; line-height: 24px; text-indent: 30px;"> 沒有起到防錯作用</span>*/
 {
  strcpy(ptr," world");
  printf("%s/n",ptr);
 }
#endif
 getch();
 return 0;
}

free(str)后指針仍然指向原來的堆地址,即你仍然可以繼續使用,但很危險,因為操作系統已經認為這塊內存可以使用,他會毫不考慮的將他分配給其他程序,于是你下次使用的時候可能就已經被別的程序改掉了,這種情況就叫“野指針”,所以最好free()了以后再置空
str = NULL;
即本程序已經放棄再使用他。
何謂“野指針”,在這里補充一下。
野指針是指程序員或操作者不能控制的指針。野指針不是NULL指針,而是指向“垃圾”的指針。

造成“野指針”的原因主要有
1.指針變量沒有初始化,
任何指針變量剛被創建時不會自動成為NULL指針,它的缺省值是隨機的,它會亂指一氣。在初始化的時候要么指向合法的指針,要么指向NULL。

2.指針變量被free或delete之后,沒有設置為NULL。它們只是把指針所指的內存給釋放掉,但并沒有把指針本身干掉。通常會用語句if (p != NULL)進行防錯處理。很遺憾,此時if語句起不到防錯作用,因為即便p不是NULL指針,它也不指向合法的內存塊。上文DEMO則是這種情況。

3.指針操作超越了變量的作用范圍。注意其生命周期。

【下面是摘自論壇里面的形象比喻,加深理解?!?BR>CRT的內存管理模塊是一個管家。  
你的程序(簡稱“你”)是一個客人。  
管家有很對水桶,可以用來裝水的。  
malloc的意思就是“管家,我要XX個水桶”。  
管家首先看一下有沒有足夠的水桶給你,如果沒有,那么告訴你不行。如果夠,那么登記這些水桶已經被使用了,然后告訴你“拿去用吧”。  
free的意思就是說:“管家我用完了,還你!”。  
至于你是不是先把水倒干凈才給管家,那么是自己的事情了。--是不是清零。
  
管家也不會將你歸還的水桶倒倒干清(他有那么多水桶,每個歸還都倒干凈豈不累死了)。反正其他用的時候自己會處理的啦。  
free之后將指針清零只是提醒自己,這些水桶已經不是我的了,不要再完里面放水了,^_^  
如果free了之后還用那個指針的話,就有可能管家已經將這些水桶給了其他人裝飲料的了,你卻往里面撒了泡尿。好的管家可能會對你的行為表示強烈的不滿, 殺了你(非法操作)--這是最好的結果,你知道自己錯了(有錯就改嘛)。一些不好的管家可能忙不過來,有時候抓到你作壞事就懲罰你,有時候卻不知道去那里 了--這是你的惡夢,不知道什么時候、怎么回事情自己就死了。不管怎么樣,這種情況下很有可能有人要喝尿--不知道是你的老板還是你的客戶了.^_^。  
所以啊,好市民當然是還了給管家的東西就不要再占著啦,.^_^。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲美女av黄| 亚洲国产成人在线播放| 日韩中文字幕免费| 欧美日在线观看| 亚洲人成啪啪网站| 欧美做受高潮电影o| 欧美一级淫片丝袜脚交| 国产精品嫩草影院一区二区| 日韩在线免费视频观看| 亚洲欧美日韩第一区| 一道本无吗dⅴd在线播放一区| 久久99国产精品久久久久久久久| 亚洲一区二区在线播放| 在线观看免费高清视频97| 国色天香2019中文字幕在线观看| 日韩国产一区三区| 亚洲一区二区三区四区在线播放| 欧洲一区二区视频| 欧美国产乱视频| 91精品91久久久久久| 欧美大码xxxx| 欧美黄色片免费观看| 亚洲伊人久久大香线蕉av| 中文字幕9999| 91美女片黄在线观| 久久高清视频免费| 亚洲а∨天堂久久精品9966| 亚洲人成网站色ww在线| 色天天综合狠狠色| 亚洲欧美国产精品va在线观看| 成人在线激情视频| 国产精品91在线观看| 91系列在线播放| 日产精品久久久一区二区福利| 亚洲美女av电影| 九九精品视频在线观看| 精品国产999| 狠狠久久五月精品中文字幕| 精品久久久久久久中文字幕| 青青a在线精品免费观看| 欧美激情视频免费观看| 欧美孕妇性xx| 亚洲欧美日韩精品久久| 在线观看日韩av| 在线精品国产欧美| 日韩黄在线观看| 国产精品一区二区久久| 国产精品久久一| 国产精品电影在线观看| 国产亚洲欧美另类中文| 中文字幕精品www乱入免费视频| 成人妇女淫片aaaa视频| 成人a级免费视频| 中文字幕一区二区三区电影| 亚洲精品免费一区二区三区| 97国产真实伦对白精彩视频8| 91精品国产自产91精品| 欧美亚洲成人免费| 在线播放国产精品| 国产精品久久97| 亚洲国产女人aaa毛片在线| 亚洲欧美中文日韩v在线观看| 亚洲国产欧美一区二区三区久久| 中文字幕在线看视频国产欧美在线看完整| 日韩中文字幕在线播放| 欧美成人激情在线| 亚洲精品456在线播放狼人| 亚洲国产古装精品网站| 日韩欧美成人精品| 亚洲精品欧美极品| 亚洲欧美日韩中文视频| 亚洲精品国产综合久久| 精品中文字幕在线2019| 日韩av片免费在线观看| 国产精品久久久久久av福利软件| 欧美最猛性xxxxx免费| 成人激情视频在线观看| 欧洲亚洲免费视频| www国产亚洲精品久久网站| 91成人天堂久久成人| 亚洲香蕉伊综合在人在线视看| 精品国产一区二区三区在线观看| 最近日韩中文字幕中文| 91视频国产一区| 美乳少妇欧美精品| 久久97精品久久久久久久不卡| 91久久在线播放| 亚洲最大成人在线| 亚洲欧洲一区二区三区在线观看| 久久久久久国产精品久久| 狠狠色狠狠色综合日日小说| 欧美黑人xxx| 亚洲午夜久久久影院| 欧美激情女人20p| 国产精品a久久久久久| 日韩av在线资源| 国外成人在线直播| 国产精品视频公开费视频| 亚洲国产日韩精品在线| 日韩av第一页| 久久久国产一区| 成人免费在线网址| 伊人伊成久久人综合网小说| 韩剧1988在线观看免费完整版| 久久久97精品| 精品久久久精品| 欧美在线一级视频| 欧美性videos高清精品| 欧美精品激情在线| 日韩欧美高清视频| 日韩电影大全免费观看2023年上| 亚洲欧美在线一区| 高清在线视频日韩欧美| 国产精品黄页免费高清在线观看| 国产97在线观看| xxxx欧美18另类的高清| 欧美在线一区二区视频| 国模私拍视频一区| 日韩国产在线播放| 成人中心免费视频| 亚洲精品在线观看www| 日韩在线www| 国产精品av电影| 国产精品v片在线观看不卡| 国产亚洲欧美日韩精品| 日韩av手机在线观看| 伊人伊人伊人久久| 最新国产成人av网站网址麻豆| 国产一区二区黑人欧美xxxx| 国产精品扒开腿做爽爽爽的视频| 国产精品毛片a∨一区二区三区|国| 午夜精品久久久久久久久久久久久| 欧美理论电影在线播放| 国产精品视频在线观看| 久久伊人精品一区二区三区| 成人欧美在线观看| 欧美猛交ⅹxxx乱大交视频| 色中色综合影院手机版在线观看| 91亚洲午夜在线| 久久久噜久噜久久综合| 欧美大片欧美激情性色a∨久久| 91网站免费看| 欧美激情网站在线观看| 欧美色xxxx| 一区二区三区在线播放欧美| 另类图片亚洲另类| 国产精品xxx视频| 麻豆国产va免费精品高清在线| 韩国精品久久久999| 成人免费淫片视频软件| 久久精品色欧美aⅴ一区二区| 国产精品久久久久久久久借妻| 欧美放荡办公室videos4k| 久99久在线视频| www高清在线视频日韩欧美| 超碰91人人草人人干| 亚洲精品美女在线| 亚洲人午夜色婷婷| 亚洲自拍小视频免费观看| 日韩成人av网址| 日韩成人在线免费观看| 欧美最顶级丰满的aⅴ艳星| 国产suv精品一区二区三区88区| 97视频com|