重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
按你說的,沒有把指針返回也沒有釋放,那么函數(shù)返回時開辟的空間還在,但你已無法引用。
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供平定網(wǎng)站建設(shè)、平定做網(wǎng)站、平定網(wǎng)站設(shè)計、平定網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、平定企業(yè)網(wǎng)站模板建站服務(wù),10余年平定做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
用malloc是在堆中分配的空間,用完需用自已顯示釋放.
采用如int
a=0的方式會在棧中分配空間,函數(shù)返回時棧指針回移,此空間仍能被其它函數(shù)使用(相當(dāng)于自動釋放)
其實寫一個函數(shù),開頭的聲明變量或數(shù)組就是在開辟空間,所以只要寫代碼,開辟空間的事肯定就少不了。但你這里說的我想應(yīng)該是指“動態(tài)開辟空間”。動態(tài)開辟空間一般在以下情況下進行:
編程時不知道需要多大的空間,要在程序運行時由用戶輸入大小或計算出所需大??;
一些數(shù)據(jù)量太大,棧區(qū)放不下,需要創(chuàng)建在堆里;
由于某需要要求代碼這樣寫。
大致就這些情況。
①C語言編碼的時候不會開辟內(nèi)存,只有在編譯之后才會生成可執(zhí)行程序,在可執(zhí)行程序里面給出內(nèi)存的開辟方法。
②真正內(nèi)存的開辟是在程序運行的時候。程序裝載到內(nèi)存里面,開始運行才會真正開辟內(nèi)存。
③C語言程序裝載到內(nèi)存中之后,其在內(nèi)存中的進程空間中有代碼區(qū)、全局數(shù)據(jù)區(qū)、堆區(qū)和棧區(qū)。代碼區(qū)存放代碼編譯后的執(zhí)行指令;全局數(shù)據(jù)區(qū)存放全局變量和靜態(tài)變量;棧區(qū)存放函數(shù)內(nèi)部的局部變量和返回地址,這部分內(nèi)存是在函數(shù)調(diào)用時才申請的;堆區(qū)是自由申請內(nèi)存的區(qū)域。需要使用malloc等自己分配內(nèi)存,這部分內(nèi)存需要自己釋放。
④向int i;這樣的句子,在C語言中,既是聲明又是定義,所以這樣的語句其實已經(jīng)分配了內(nèi)存,而不是等到賦值的時候。
⑤有不懂的可以追問。
#includestdio.h
#includestdlib.h
typedef struct Lnode
{
int data;
struct Lnode *next;
}Lnode,*LinkList;
LinkList Init()
{
LinkList L = NULL;
printf("%d ",L);
L=(LinkList)malloc(sizeof(Lnode));
printf("%d ",L);
L-next=0;
return L;
}
void main()
{
LinkList A = NULL;
printf("%d ",A);
A = Init();
}