1. 程式人生 > >C語言中free()函數釋放struct結構體中的規律

C語言中free()函數釋放struct結構體中的規律

void poi inf clu main 圖片 刪除 動態分配 不同

並不是什麽新鮮的事情,不過值得註意。
首先我們知道,在使用struct來定義並聲明一個變量時,將會自動劃分出一個連續的儲存空間(雖然根據某些對齊原則會出現內存間隙,但是大體上來說還是連續的)
這一塊連續空間將會包括結構體中的其他變量所需要的內存。就像這樣。
這是一個名為X的結構體變量

技術分享圖片

而free()函數的作用是對動態分配的內存進行釋放,這也就意味著當使用free函數清空一個結構體時,只會清空這個大框裏的內存,而不會對a,b,c,d指向的內存進行清理。
當然,一般來說直接定義變量於結構體內會更加方便。
但是考慮一下兩種聲明

struct stuff{
    char home[10];
    int
num; char name[10]; }; struct stuff{ char *home; int num; char name[10]; };

兩者的不同在於,第二種使用的是char指針,所以進行gets(),或者初始化時,*home將會把值儲存在常量區。

那麽我們考慮一下以下代碼
目的是為了查看,在free前後,*home與name的變化

#include <stdio.h>
#include <string.h>

struct stuff{ 
    char *home; 
    int num; 
    char
name[10]; }; int main(void){ struct stuff *TOM=(struct stuff *)malloc(sizeof(struct stuff)); TOM->home="LONDON"; TOM->num=201; strcpy(TOM->name,"TOM"); char *p1=TOM->home; char *p2=TOM->name; printf("home=%s pointer of home%p name=%s\n",TOM->home,TOM->home,TOM->name);
free(TOM); printf("home=%s pointer of home%p name=%s\n",p1,p1,p2); return 0 }
運行結果:
home=LONDON pointer of home0000000000404000  name=TOM
home=LONDON pointer of home0000000000404000  name=

嗯,我們可以發現home的值仍然保存著,而name的內存被釋放。
綜上我們可以得出什麽結論呢?
free()只能釋放指針所指向的那片內存。也就是說,如果我們不斷地聲明第二種類型的結構體的話,即使調用free()也會造成內存的浪費。最明顯的應該是體現在鏈表類結構。
所以如果要進行插入與刪除的操作的話還是考慮第一種結構體靠譜。

2018.10.26
小白剛剛學到結構體,故記之

C語言中free()函數釋放struct結構體中的規律