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


並不是什么新鮮的事情,不過值得注意。
首先我們知道,在使用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
小白剛剛學到結構體,故記之


免責聲明!

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



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