C語言中動態內存的分配(malloc,realloc)


 

動態內存分配:根據需要隨時開辟,隨時釋放的內存分配方式。
分配時機和釋放時機完全由程序員決定,由於沒有數據聲明,這部分空間沒有名字。
無法像使用變量或數組那樣通過變量名或數組名引用其中的數據,只能通過指針變量來訪問。
注意malloc與free一般都是成對出現的只要成功申請的空間使用完后必須要釋放,否則會造成內存的泄露。

#include<stdio.h>
#include<stdlib.h>
int sum(int *,int);///函數的聲明
int main()
{
    int n,s,i,*p;
    scanf("%d",&n);
    p=(int *)malloc(n*sizeof(int));///malloc的返回值是void*,與p類型不一致需要強制轉換,若不則自動但是會受到警告
    if(p==NULL)///動態內存分配失敗
        exit(1);///停止程序的運行
    for(i=0;i<=n-1;i++)
        scanf("%d",p+i);///指針變量的輸入
    s=sum(p,n);///調用函數傳指針變量
    printf("%d\n",s);
    free(p);///釋放內存中由malloc()函數分配的空間
    return 0;
}
int sum(int *p,int n)
{
    int i,s=0;
    for(i=0;i<=n-1;i++)
        s=s+(*p++);
    return s;
}

 

 2018年11月10號晚更新一下這篇博客,當時寫這篇博客的時候是大一上學期學C語言,對動態分配了解不夠,只是介紹了malloc與free,今天看數據結構的代碼又產生了對realloc()函數的一些疑問,這里進行一下說明。

摘自https://blog.csdn.net/hackerain/article/details/7954006

realloc(void *__ptr, size_t __size):

將ptr所指出的已分配內存區的大小改為size

更改已經配置的內存空間,即更改由malloc()函數分配的內存空間的大小。

如果將分配的內存減少,realloc僅僅是改變索引的信息。

如果是將分配的內存擴大,則有以下情況: 1)如果當前內存段后面有需要的內存空間,則直接擴展這段內存空間,realloc()將返回原指針。 2)如果當前內存段后面的空閑字節不夠,那么就使用堆中的第一個能夠滿足這一要求的內存塊,將目前的數據復制到新的位置,並將原來的數據塊釋放掉,返回新的內存塊位置。 3)如果申請失敗,將返回NULL,此時,原來的指針仍然有效。

注意:如果調用成功,不管當前內存段后面的空閑空間是否滿足要求,都會釋放掉原來的指針,重新返回一個指針,雖然返回的指針有可能和原來的指針一樣,即不能再次釋放掉原來的指針。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM