動態內存分配:根據需要隨時開辟,隨時釋放的內存分配方式。
分配時機和釋放時機完全由程序員決定,由於沒有數據聲明,這部分空間沒有名字。
無法像使用變量或數組那樣通過變量名或數組名引用其中的數據,只能通過指針變量來訪問。
注意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,此時,原來的指針仍然有效。
注意:如果調用成功,不管當前內存段后面的空閑空間是否滿足要求,都會釋放掉原來的指針,重新返回一個指針,雖然返回的指針有可能和原來的指針一樣,即不能再次釋放掉原來的指針。