1. 程式人生 > >關於c語言中malloc和remalloc函式的分析

關於c語言中malloc和remalloc函式的分析

首先申明,這是本人第一次寫部落格,其目的僅僅是為了加強自己對知識點的掌握,為到達在本子上記筆記的效果

進入正題。對於malloc,它的作用就是為了動態分配空間,像c++中的new一樣。這裡就不說他們兩的區別了。malloc函式有這樣幾個特點。

1.分配的空間地址是連續的,但是其值(這裡說的不是地址值,是變數值)是沒有初始化的。

2.如果你僅僅只分配5*int個位元組,但是卻操作了第6個位元組的資料。例如:int *p = (int *)malloc(5 * sizeof(int));p[5]=3;這樣子並不會報錯,並且程式可能會”完美“執行。但是這樣子是不安全的,你可能會修改原來在p[5]的資料的值。

現在,說一下關於remalloc函式,說明一下,以下內容參考過別人的部落格,文章後面我會寫上傳送門,但是這些實驗都還是我自己test的。realloc(void *__ptr, size_t __size)函式就是為了修改malloc函式分配的記憶體空間。當然,你可以是malloc函式記憶體空間減少,也可以使其增加。

舉個例子:int *p = (int *)malloc(5 * sizeof(int));int *pp = (int *)realloc(p, 3 * sizeof(int));你這樣做就會使原來的記憶體空間減少。但是,這個僅僅只是改變索引,並沒有影響原來malloc函式分配的記憶體空間地址。但是這裡要注意一下free()函式的使用。對於剛剛你審請的記憶體空間,使用free(p)和free(pp)都是可以的,但是不允許同時使用。因為他們的指向還是同一塊記憶體空間。即使你free(p);p = nullptr;後&pp的值還是不是NULL。(但是在釋放之前,&p和&pp的值是一樣的)。

對於增加分配的空間。int *p = (int *)malloc(5 * sizeof(int));int *pp = (int *)realloc(p, 10* sizeof(int));這裡就要分幾類情況了。如果是將分配的記憶體擴大,則有以下情況: 1)如果當前記憶體段後面有需要的記憶體空間,則直接擴充套件這段記憶體空間,realloc()將返回原指標。 2)如果當前記憶體段後面的空閒位元組不夠,那麼就使用堆中的第一個能夠滿足這一要求的記憶體塊,將目前的資料複製到新的位置,並將原來的資料塊釋放掉,返回新的記憶體塊位置。 3)如果申請失敗,將返回NULL,此時,原來的指標仍然有效。

注意:如果呼叫成功,不管當前記憶體段後面的空閒空間是否滿足要求,都會釋放掉原來的指標,重新返回一個指標,雖然返回的指標有可能和原來的指標一樣,即不能再次釋放掉原來的指標。

(這裡的話是直接複製的一位博主的)

這裡說的是什麼意思捏。就是說free()時候時可能會出現問題。程式碼如下,大家可以去測試一哈。

#include "pch.h" #include<stdio.h> #include<stdlib.h>

int main() {     int *p = (int *)malloc(5 * sizeof(int));

    //連續分配的記憶體地址(但是沒有初始化)     printf("malloc申請的空間值:\n\n");          for (int i = 0; i < 10; i++)     {         p[i] = i + 1;         printf("%d ", &p[i]);     }

   int *pp = (int *)realloc(p, 10 * sizeof(int));

   // free(p);//這裡是會報錯的,因為在執行remalloc函式時,就已經free(p)了,所以,這裡你相當於再次釋放該記憶體空間。    // p = nullptr;     printf("%d\n%d\n", p, pp);     free(pp);     pp = nullptr;

    return 0;

}

這裡還有一些,我覺得別的博主說的挺好的

        如果size較小,原來申請的動態記憶體後面還有空餘記憶體,系統將直接在原記憶體空間後面擴容,並返回原動態空間基地址;

        如果size較大,原來申請的空間後面沒有足夠大的空間擴容,系統將重新申請一塊(20+size)*sizeof(int)的記憶體,並把原來空間的內容拷貝過去,原來空間free;

        如果size非常大,系統記憶體申請失敗,返回NULL,原來的記憶體不會釋放。

       文章中用到了以下兩位博主的話語,大家也可以去看看大佬寫的文章。

       第一次寫部落格,寫大家多多關照,可能錯誤很多,希望大家見諒。也希望大家一起探討問題。

        原文:https://blog.csdn.net/u014170207/article/details/53126340         版權宣告:本文為博主原創文章,轉載請附上博文連結!

原文:https://blog.csdn.net/hackerain/article/details/7954006         版權宣告:本文為博主原創文章,轉載請附上博文連結!