最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言之free函數(shù)以及野指針介紹

 更新時間:2013年07月11日 11:07:32   作者:  
以下是對C語言中的free函數(shù)與野指針進行了詳細的分析介紹,需要的朋友可以參考下

【FROM MSDN && 百科】
原型:void free(void *ptr);
#include<stdlib.h>或#include <malloc.h>
Deallocate space in memory
釋放ptr指向的存儲空間。被釋放的空間通常被送入可用存儲區(qū)池,以后可在調用malloc、realloc以及realloc函數(shù)來再分配。
注意:連續(xù)兩次使用free函數(shù),肯定會發(fā)生錯誤。malloc的次數(shù)要和free的次數(shù)相等。
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( ) 用來將上一個函數(shù)發(fā)生錯誤的原因輸出到標準設備(stderr)。參數(shù) 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;">&nbsp;ptr 所指的內存被釋放,但是ptr所指的地址仍然不變,原來的內存變?yōu)椤袄眱却妫ú豢捎脙却?</span>
#if 1
 if (ptr!=NULL)    /*<span style="font-family: arial, 宋體, sans-serif; font-size: 13.63636302947998px; line-height: 24px; text-indent: 30px;">&nbsp;沒有起到防錯作用</span>*/
 {
  strcpy(ptr," world");
  printf("%s\n",ptr);
 }
#endif
 getch();
 return 0;
}

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

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

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

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

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

相關文章

  • 基于C語言實現(xiàn)貪吃蛇小游戲

    基于C語言實現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言實現(xiàn)飛機游戲(進階版)的示例代碼

    C語言實現(xiàn)飛機游戲(進階版)的示例代碼

    在前文中,已經(jīng)帶大家利用C語言實現(xiàn)了簡單的飛機游戲,但它還存在一些缺陷。因此,本文將給大家?guī)磉M階版的飛機游戲,需要的可以參考一下
    2022-10-10
  • C++ 格式化日志輸出實現(xiàn)代碼

    C++ 格式化日志輸出實現(xiàn)代碼

    這篇文章主要介紹了C++ 格式化日志輸出實現(xiàn)代碼,需要的朋友可以參考下
    2019-04-04
  • 詳解C++中的菱形繼承問題

    詳解C++中的菱形繼承問題

    這篇文章主要介紹了詳解C++中的菱形繼承問題,在多繼承結構中,存在著很多問題,比如從不同基類中繼承了同名成員,派生類中也定義了同名成員,這種二義性問題很好解決,加上要訪問的基類的類名限制就可以了,需要的朋友可以參考下
    2023-08-08
  • 用C語言實現(xiàn)排雷游戲

    用C語言實現(xiàn)排雷游戲

    大家好,本篇文章主要講的是用C語言實現(xiàn)排雷游戲,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C語言中注釋與注意事項的深入講解

    C語言中注釋與注意事項的深入講解

    在編寫C語言源代碼時,應該多使用注釋,這樣有助于對代碼的理解,這篇文章主要給大家介紹了關于C語言中注釋與注意事項的相關資料,需要的朋友可以參考下
    2021-09-09
  • MFC中exe圖標修改的方法

    MFC中exe圖標修改的方法

    修改窗口標題圖標可通過導入圖標,然后在CMainFrame.:OnCreate函數(shù)中加載圖標即可, 代碼如下:
    2013-04-04
  • C語言 遞歸實現(xiàn)排雷游戲

    C語言 遞歸實現(xiàn)排雷游戲

    掃雷是電腦上很經(jīng)典很經(jīng)典的傳統(tǒng)老游戲,從小編第一次摸到計算機開始就玩過掃雷,雖然當時并不理解玩法原理,但終是第一次玩電腦游戲,下面來從掃雷的前世今生講起
    2021-11-11
  • C語言中回調函數(shù)的含義與使用場景詳解

    C語言中回調函數(shù)的含義與使用場景詳解

    這篇文章主要為大家詳細介紹了C語言中回調函數(shù)的含義與使用場景,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言數(shù)據(jù)結構之順序表和單鏈表

    C語言數(shù)據(jù)結構之順序表和單鏈表

    在數(shù)據(jù)結構中,線性表是入門級數(shù)據(jù)結構,線性表又分為順序表和鏈表,這篇文章主要給大家介紹了關于C語言數(shù)據(jù)結構之順序表和單鏈表的相關資料,需要的朋友可以參考下
    2021-06-06

最新評論

怀宁县| 柘荣县| 汾西县| 宜州市| 右玉县| 夏津县| 崇州市| 永善县| 元朗区| 天气| 阜宁县| 得荣县| 沅陵县| 江北区| 仲巴县| 大姚县| 册亨县| 株洲市| 汕尾市| 鹤壁市| 尚义县| 禄劝| 精河县| 楚雄市| 彭泽县| 海盐县| 瓦房店市| 涟源市| 枞阳县| 都匀市| 沭阳县| 萨嘎县| 仙游县| 盐源县| 天祝| 长汀县| 岚皋县| 长乐市| 房产| 太康县| 泾源县|