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

C語言中動態(tài)內(nèi)存管理初學(xué)者容易犯的6個錯誤分享

 更新時間:2023年04月02日 10:37:34   作者:努力學(xué)習(xí)游泳的魚  
本篇文章主要介紹了初學(xué)者使用C語言中動態(tài)內(nèi)存管理的4個函數(shù)時最容易犯的6個錯誤,以及如何避免這些錯誤,文中的示例代碼講解詳細(xì),感興趣的可以了解一下

我在這篇文章中,詳細(xì)講解了C語言中的4個動態(tài)內(nèi)存管理函數(shù)。本篇文章,我會講解初學(xué)者使用這4個函數(shù)時最容易犯的6個錯誤,以及如何避免這些錯誤。這6個容易犯的錯誤分別是:

  • 對NULL指針的解引用操作。
  • 對動態(tài)內(nèi)存的越界訪問。
  • 忘記free。
  • 對同一塊空間free兩次。
  • free動態(tài)內(nèi)存的一部分。
  • free非動態(tài)開辟的內(nèi)存。

我希望,當(dāng)你閱讀完本篇文章后,不要犯類似的錯誤。

1.對NULL指針的解引用操作

當(dāng)你malloc一塊空間時,是有可能開辟失敗的。一旦失敗,malloc會返回NULL指針。如果不判斷malloc的返回值,就直接使用malloc返回的指針,有可能導(dǎo)致對NULL指針的解引用操作。例如:

int* p = (int*)malloc(10 * sizeof(int));
for (int i = 0; i < 10; i++)
{
    p[i] = i + 1;
}

由于malloc可能返回NULL指針,一旦p為NULL,對其解引用是非常危險的!

解決方法:每次使用malloc, calloc, realloc等函數(shù)時,一定要判斷返回值是否為NULL。

int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)
{
    // 錯誤處理
    perror("malloc");
    exit(-1);
}
// 此時p一定不為NULL
for (int i = 0; i < 10; i++)
{
    p[i] = i + 1;
}

2.對動態(tài)內(nèi)存的越界訪問

假設(shè)你使用malloc申請了40個字節(jié)的空間,一定要記住這塊空間的大小,不能越界訪問。比如:

int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)
{
    // 錯誤處理
    perror("malloc");
    exit(-1);
}
for (int i = 0; i <= 10; i++)
{
    p[i] = i + 1;
}

上面的代碼中,當(dāng)i==10時,p[i]等價于*(p+10),已經(jīng)超出了申請的40個字節(jié)的空間,這是非常危險的!

解決方法:無論如何,在用指針訪問內(nèi)存時,一定要觀察其是否越界!比如上面的代碼,只能訪問p[0]~p[9]的空間。

3.忘記free

如果你使用malloc等函數(shù),開辟了空間,但是確沒有free,就會導(dǎo)致內(nèi)存泄漏!對于程序員來說,這種情況是非常不舒服的,一定要避免。

解決方法:對于每一塊動態(tài)內(nèi)存開辟的空間,使用完后都要free。比如:

int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)
{
    perror("malloc");
    exit(-1);
}
// 使用
// ...
free(p);
p = NULL;

4.對同一塊空間free兩次

如果已經(jīng)free過一塊空間了,如果再free一次,那不多此一舉嗎!不僅如此,如果第一次free之后沒有把這個指針置為NULL,第二次free的時候,這個指針是一個野指針,是非常危險的!

int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)
{
    perror("malloc");
    exit(-1);
}
// 使用
// ...
free(p);
// ...
free(p);

解決方法:你free一次就行了,干啥要free兩次呀!

值得說明的是,由于free(NULL);時,free函數(shù)啥也不干,所以下面的代碼是不會有問題的,但也不建議這么寫(有點吃飽了撐著的感覺)。

// ...
free(p);
p = NULL;
free(p);

5.free動態(tài)內(nèi)存的一部分

注意,free一個指針的時候,這個指針必須指向動態(tài)內(nèi)存的起始位置!比如下面的代碼中,如果這個指針已經(jīng)不指向起始位置了,free的時候也是非常危險的。

int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)
{
    perror("malloc");
    exit(-1);
}
// ...
p += 5;
// ...
free(p);
p = NULL;

由于在malloc之后,free之前,指針p已經(jīng)不指向動態(tài)內(nèi)存的起始位置了,此時再free掉p就會出問題。

解決方法:由于free的時候需要知道動態(tài)內(nèi)存的起始地址,在使用這塊內(nèi)存的時候不建議改變p的指向。除此之外,如果使用realloc擴(kuò)容,一定要更新p,時刻讓p指向動態(tài)內(nèi)存的起始地址,方便free釋放。

int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)
{
    perror("malloc");
    exit(-1);
}
// ...
// 使用時時刻讓p指向動態(tài)內(nèi)存的起始位置!
int* tmp = (int*)realloc(p, 20 * sizeof(int));
if (tmp == NULL)
{
    free(p);
    p = NULL;
    perror("realloc");
    exit(-1);
}
else
{
    p = tmp;
}
// ...
free(p);
p = NULL;

6.free非動態(tài)開辟的內(nèi)存

free是用來釋放動態(tài)開辟的內(nèi)存的。所以,如果這塊內(nèi)存空間不是用malloc, calloc, realloc動態(tài)開辟的,就別free啦。

int arr[10] = {0};
// ...
int a = 0;
int* pa = &a;
// ...
free(arr);
arr = NULL;
free(pa);
pa = NULL;

解決方法:不要寫出這樣的代碼,free的時候得看清楚,這塊空間到底是不是動態(tài)開辟的空間,時刻保持頭腦清醒。

總結(jié)

C語言動態(tài)內(nèi)存管理時,容易犯的6個錯誤及解決方法:

1.對NULL指針的解引用操作。這是由于malloc等函數(shù)有可能返回NULL,所以需要檢查返回值。

2.對動態(tài)內(nèi)存的越界訪問。時時刻刻記住,這塊空間究竟有多大,不要越界了。

3.忘記free。別忘記就行。

4.對同一塊空間free兩次。free一次就行啦,再free一次是多此一舉。

5.free動態(tài)內(nèi)存的一部分。時時刻刻讓一個指針記住這塊動態(tài)內(nèi)存的起始地址。

6.free非動態(tài)開辟的內(nèi)存。保持頭腦清醒,只有malloc, calloc, realloc出來的空間才需要free。

到此這篇關(guān)于C語言中動態(tài)內(nèi)存管理初學(xué)者容易犯的6個錯誤分享的文章就介紹到這了,更多相關(guān)C語言動態(tài)內(nèi)存管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡要解讀C++的動態(tài)和靜態(tài)關(guān)聯(lián)以及虛析構(gòu)函數(shù)

    簡要解讀C++的動態(tài)和靜態(tài)關(guān)聯(lián)以及虛析構(gòu)函數(shù)

    這篇文章主要介紹了簡要解讀C++的動態(tài)和靜態(tài)關(guān)聯(lián)以及虛析構(gòu)函數(shù),析構(gòu)函數(shù)在C++編程中平時并不是太常用,需要的朋友可以參考下
    2015-09-09
  • Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用

    Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用

    這篇文章主要為大家介紹了Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • C語言之雙向鏈表詳解及實例代碼

    C語言之雙向鏈表詳解及實例代碼

    這篇文章主要介紹了C語言之雙向鏈表的相關(guān)資料,并附實例代碼,有需要的小伙伴可以參考下
    2016-09-09
  • 嵌入式QT移植的實現(xiàn)

    嵌入式QT移植的實現(xiàn)

    本文主要介紹了嵌入式QT移植的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Qt利用ffmpeg實現(xiàn)音視頻同步

    Qt利用ffmpeg實現(xiàn)音視頻同步

    這篇文章主要為大家詳細(xì)介紹了Qt如何利用ffmpeg實現(xiàn)音視頻同步的功能,文中的示例代碼講解詳細(xì),對大家深入了解Qt有一定的幫助,需要的可以參考一下
    2023-01-01
  • C語言求2的n次方多種方法總結(jié)

    C語言求2的n次方多種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于C語言求2的n次方多種方法的相關(guān)資料,求2的N次冪是一個常用的功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 學(xué)習(xí)二維動態(tài)數(shù)組指針做矩陣運算的方法

    學(xué)習(xí)二維動態(tài)數(shù)組指針做矩陣運算的方法

    這片文章介紹了如何利用二維動態(tài)數(shù)組指針做矩陣運算,需要的朋友可以參考下
    2015-07-07
  • C/C++線程退出的四種方法小結(jié)

    C/C++線程退出的四種方法小結(jié)

    本文主要介紹了C/C++線程退出的四種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 詳解C++中的雙冒號 ::

    詳解C++中的雙冒號 ::

    這篇文章主要介紹了C++中的雙冒號 ::,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • C語言實現(xiàn)合式公式的判斷示例

    C語言實現(xiàn)合式公式的判斷示例

    這篇文章主要介紹了C語言實現(xiàn)合式公式的判斷示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論

澎湖县| 定安县| 富阳市| 淳化县| 晋宁县| 米脂县| 闽清县| 江津市| 金昌市| 当雄县| 泽州县| 浪卡子县| 乐平市| 上林县| 广水市| 金寨县| 鄱阳县| 阳东县| 什邡市| 蚌埠市| 金湖县| 达尔| 丽江市| 游戏| 屏南县| 洛宁县| 壶关县| 大悟县| 黄骅市| 东阿县| 定州市| 蚌埠市| 徐汇区| 垣曲县| 哈尔滨市| 南涧| 徐水县| 彭山县| 万全县| 双鸭山市| 肇州县|