歡迎點擊「算法與編程之美」↑關注咱們!算法
本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列博客。編程
1 問題描述數組
在學習C語言的時候,咱們都會頻繁的接觸到結構體,使用結構體定義新的數據類型,從而更加方便的存儲數據。可是在使用結構體的時候,有些問題會常常會困擾咱們,以下所示:微信
第一種結構體定義:函數
struct school{學習
char address[100];編碼
char name[30];3d
};指針
第二種結構體定義:教程
struct school_other{
char *address;
char *name;
};
以上兩種結構體的定義有什麼區別?咱們在使用的時候須要注意什麼?
本文將和你們一塊兒來深刻的探討這個問題。
2 分析問題
不少時候對於你們來講,最重要的不是獲得問題的答案,而是學會別人是如何分析問題的,這種解決問題的思路對於你們來講纔是最重要的,也是最精彩的地方。
C語言中定義的任何一個變量,最終都會從你的內存條上拿走相應的內存空間,如定義了一個int a;那麼四個字節的空間就給a這個變量了。既然如此,咱們很好奇,上述兩種類型的結構體,分別佔用了多大的內存空間呢?爲了解決這個問題,咱們編寫了如下的程序:
這個程序應該很簡單,相信各位同窗都能看懂,首先定義了兩個結構體類型struct school和struct school_other,而後在main函數中定義了兩個變量,最後使用sizeof()函數得到變量的內存空間大小。
程序的輸出結果以下:
這種輸出結果不知是你們意料之中仍是意料以外呢?不管是哪一種狀況,咱們一塊兒來分析分析。
若是要咱們去計算第一個結構體的內存佔用空間,你該如何去計算?
struct school{
char address[100];
char name[30];
};
因爲sizeof(char)==1獲得每個字符型數據佔用的空間大小是一個字節,所以上述結構體佔用的空間應該是:1 Byte * 100 + 1 Byte * 30 = 130 Byte,這個答案和輸出的結果是一致的。
按照一樣的方式咱們去計算另一個結構體的內存佔用空間:
struct school_other{
char *address;
char *name;
};
因爲sizeof(char *) == 8獲得每個指針類型的數據佔用的空間是八個字節,所以上述結構體佔用的空間應該是:8 Byte * 1 + 8 Byte * 1 = 16 Byte,這個答案也和輸出結果一致。
爲何要花這麼多的篇幅去介紹結構體類型空間大小呢?
貌似和主題無關,其實正是深刻理解主題的核心所在。本文定義一個school結構體的目的在於經過school結構體可以保存某個學校的地址和名稱,而地址和名稱都是字符數組類型,這種類型能夠保存多個字符。
struct school這種結構體類型爲其成員變量address和name分配了大小分別爲100和30的內存空間,有了內存空間,所以能夠直接使用。
而struct school_other這種結構體類型並無爲其成員變量分配內存空間,所以在使用以前必須對其分配,才能夠爲其賦值。
上述問題,其實能夠進一步簡化成:
char address[100];
char* address_other;
這兩種變量你們在使用時,應該注意什麼?
address變量已經有了100個字節的內存空間,所以能夠直接對其進行賦值,而address_other只是一個指針即只是一個內存地址,而這個地址是多少並未知曉,所以在使用以前,務必要分配內存空間,而後才能使用。
3 總結
本文介紹告終構體指針類型的成員變量和數組類型的成員變量的區別,以及在使用時應該注意的問題,幫助你們更好的理解內存分配。
更多精彩文章: