中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中動態內存管理初學者容易犯的錯誤有哪些

發布時間:2023-04-19 11:29:10 來源:億速云 閱讀:76 作者:iii 欄目:開發技術

這篇“C語言中動態內存管理初學者容易犯的錯誤有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C語言中動態內存管理初學者容易犯的錯誤有哪些”文章吧。

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

當你malloc一塊空間時,是有可能開辟失敗的。一旦失敗,malloc會返回NULL指針。如果不判斷malloc的返回值,就直接使用malloc返回的指針,有可能導致對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等函數時,一定要判斷返回值是否為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.對動態內存的越界訪問

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

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

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

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

3.忘記free

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

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

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

4.對同一塊空間free兩次

如果已經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函數啥也不干,所以下面的代碼是不會有問題的,但也不建議這么寫(有點吃飽了撐著的感覺)。

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

5.free動態內存的一部分

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

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

由于在malloc之后,free之前,指針p已經不指向動態內存的起始位置了,此時再free掉p就會出問題。

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

int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)
{
    perror("malloc");
    exit(-1);
}
// ...
// 使用時時刻讓p指向動態內存的起始位置!
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非動態開辟的內存

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

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

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

以上就是關于“C語言中動態內存管理初學者容易犯的錯誤有哪些”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乃东县| 建阳市| 汝城县| 河西区| 古交市| 泾阳县| 监利县| 灯塔市| 石渠县| 沧州市| 东乌| 同德县| 无锡市| 禄丰县| 宜兰市| 溆浦县| 昆明市| 图木舒克市| 海伦市| 万年县| 玉林市| 大邑县| 永昌县| 隆尧县| 灌云县| 海安县| 昌江| 定日县| 化州市| 泰州市| 定兴县| 仁布县| 随州市| 鄂托克前旗| 米泉市| 隆子县| 大田县| 吉木萨尔县| 那曲县| 高邮市| 义马市|