日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言结构体占用内存总结

發布時間:2024/4/17 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言结构体占用内存总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言結構體占用內存總結

前幾天有個小朋友問了我一下,關于C語言結構體占用空間的問題。覺得以后會對小可愛有點幫助,就打算先寫一下。

struct Test {int a;char b;int c; } test;

理論上,結構體中的各個成員在內存中應該是連續儲存的,就像數組里面的元素一樣。事實上,也確實是這個樣子的,不過和我們想象的有點不一樣。
按照我們最初的想法,變量test所占的內存為 4 + 1 + 4 = 9。
但是我們寫一個小代碼驗證一下發現和我們想的不一樣。


它的內存為12。因為 int類型是4個字節,所以是不是各個成員的內存都是按照最大的那個設置呢?畢竟 4 * 3 = 12,我們再次實驗,

如果按照我們的推測,那么內存大小應該是 8 * 3 = 24。為何是16呢?
下面我來總結一下。

總結

C語言結構體所占內存大小,其實里面涉及到C語言內存對齊,提高尋址效率的一種思想在里面。具體我就不在這里展開來說了,有興趣的可以自己百度了解一下。

其實小可愛最想了解的應該是如何計算,結構體的內存大小。

  • 不包含,數組和指針的結構體

對于不包含,數組和指針的結構體,知道各個成員所占內存大小后,可以直接相加,不過相加的時候必須保證前面的成員變量的內存所占內存必須是下一個成員變量所占內存的整倍數,如果不夠就補上;并且最后的結果必須要是所占內存空間最大的成員變量的整倍數
下面我來幾個例子說明:

struct Test {double c; //8int a; //4char b; //1 } test;

所占內存大小,8 + 4 + 1 = 13,最大內存為8, 所以應該這樣計算 8 + 4 + 4 = 16。
下面我們交換下,

struct Test {int a; //4double c; //8char b; //1 } test;

所占內存大小, 4 + 8 + 1 = 13,因為double類型是8個字節,而前面只有4個字節,并且成員變量最大內存為8,所以應該這樣計算 8 + 8 + 8 = 24。

struct Test {int a; //4char b; //1double c; //8 } test;

同理4 + 1 + 8 = 13,應該變為 4 + 4 + 8 = 16。

  • 包含,數組和指針的結構體
    • 包含指針的結構體
      對于包含指針的結構體,可以用和上面相同的方法進行計算,一般指針的大小都是固定的4個字節(在我的電腦上,你們可能不同),因為不管什么類型的指針只需要儲存地址,不需要儲存地址指向空間的內容。
    struct Test {char a; //1char *b; //4double c; //8 } test; struct Test {char a; //1int *b; //4double c; //8 } test; struct Test {char a; //1double *b; //4double c; //8 } test; 這三種所占內存大小均為 4 + 4 + 8 = 16。如果將變量 b 和變量 c 的位置互換,則變為 8 + 8 + 8 = 24。
    • 包含數組的結構體
      數組中的元素地址是連續的,所以一個數組所占空間大小,為數組類型 * 元素個數。
      知道了數組所占空間大小后,再來說說如何計算結構體中包含數組的情況,在之前計算的時候,我說過相加的時候必須保證前面的成員變量的內存所占內存必須是下一個成員變量所占內存的整倍數,但是如果下一變量為數組,則沒有這個要求。
      例如:
struct Test {int a;char b[21];int d;double c; } test;

應該為 4 + 24 + 4 + 8 = 40。

struct Test {int a;char b[19];int d;double c; } test;

應該為 4 + 20 + 8 + 8 = 40。

struct Test {char a; //1char b[19]; //19int d; //4double c; //8 } test;

應該為 1 + 19 + 4 + 8 = 32。

struct Test {char a; //1char b[17]; //17int d; //4double c; //8 } test;

應該為 1 + 19 + 4 + 8 = 32。

struct Test {char a; //1char b[15]; //15int d; //4double c; //8 } test;

應該為 1 + 15 + 8 + 8 = 32。

希望可以對你有一些幫助,記得點贊加關注哦!!!
不然下次找不到了!!!!

總結

以上是生活随笔為你收集整理的C语言结构体占用内存总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。