1. 程式人生 > >C語言結構體所佔用的位元組數如何計算

C語言結構體所佔用的位元組數如何計算

結構體的資料型別的有點多我們就不囉嗦了,直接來看相同資料結構體的幾種書寫的格式吧。

  格式一:  

  01.struct tagPhone
  02.{
  03.     char   A;
  04.     int    B;
  05.     short  C;
  06.}Phone;

  格式二:

  01.struct tagPhone
  02.{
  03.     char   A;
  04.     short  C;
  05.     int    B;
  06.}Phone2;

  格式三:

  01.struct tagPhone3
  02.{
  03.     char   A;
  04.     char   B[2];
  05.     char   C[4];
  06.}Phone3;


我們都知道,char型別佔用1個位元組,int型佔用4個位元組,short型別佔用2個位元組,long佔用8個,double佔用16個;

  那麼我們可能會犯一個錯誤就是直接1+4+2=7,該結構體佔用7個位元組。這是錯的。

  以下我們簡單分析下:

  計算結構體大小時需要考慮其記憶體佈局,結構體在記憶體中存放是按單元存放的,每個單元多大取決於結構體中最大基本型別的大小。

  對格式一:

  以int型佔用4個來作為倍數,因為A佔用一個位元組後,B放不下,所以開闢新的單元,然後開闢新的單元放C,所以格式一佔用的位元組數為:3*4=12;

  同理對於格式二,

  A後面還有三個位元組,足夠C存放,所以C根著A後面存放,然後開闢新單元存放B資料。所以格式二佔用的記憶體位元組為2*4=8.

  對於格式三:

  上面結構計算大小,sizeof(Phone3) = 1 + 2 + 4 = 7, 其大小為結構體中個欄位大小之和,這也是最節省空間的一種寫法。

  總結:

  第一種寫法,空間浪費嚴重,sizeof 計算大小與預期不一致,但是保持了每個欄位的資料型別。這也是最常見的漫不經心的寫法,一般人很容易這樣寫;

  第三種寫法,最節省空間的寫法,也是使用 sizeof 求大小與預期一樣的寫法,但是全部使用位元組型別,丟失了欄位本生的資料型別,不方便使用;

  第二種寫法,介於第一種和第三種寫法之間,其空間上比較緊湊,同時又保持了結構體中欄位的資料型別。

  只要瞭解是這些寫法的差異性,可以視情況選用。

相關推薦

C語言結構佔用位元組如何計算

結構體的資料型別的有點多我們就不囉嗦了,直接來看相同資料結構體的幾種書寫的格式吧。   格式一:     01.struct tagPhone   02.{   03.     char   A;   04.     int    B;   05.     short 

C語言結構占內存大小

oat 接下來 面試題 語言 將不 位置 idt str 返回 用一道面試題題引入struct str1 { char a; int b; float c; double d; };char類型占用

C語言中關鍵字佔用位元組大小

#include <stdio.h> void main(){     /*int 位元組*/     printf("%d\n",sizeof(int)); //4      p

C語言資料型別位元組

char :1個位元組 unsigned char :1個位元組 char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器) short : 2個位元組 unsigned short : 2個位元組 int:  4個位元組 unsigned in

C語言結構屬性的偏移量計算——關於offsetof函式的詳解

//計算結構體偏移量 #include<stdio.h> #include<stdlib.h> #include<string.h> //詳解:對於offscfof()函式, //(TYPE *)0這句的意思是將記憶體地址是0記憶體塊轉

C語言結構中添加成員函

我們 pau 打印 log print class 控制 stdio.h 語言   我們在使用C語言的結構體時,經常都是只定義幾個成員變量,而學過面向對象的人應該知道,我們定義類時,不只是定義了成員變量,還定義了成員方法,而類的結構和結構體非常的相似,所以,為什麽不想想如何

C語言----結構---結構與函

urn 全局變量 月的天數 [] strong ret 例子 c語言 += 結構作為參數的函數 整個結構可以作為參數傳入函數 這時是在函數中新建了一個結構變量,並復制調用這個結構的值(重點,只是把值傳入函數,而函數外面真正的變量並沒有改變,與數組不同) 函數也可以返

C語言結構組內帶字符組初始化和賦值

指定 char 字符數 全局 種類 def 變量 指針 變量定義 1.首先定義結構體數組: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char cmdP

C語言 結構位元組對齊問題

摘選自這位大神的部落格 方法一: 結構體在記憶體中分配一塊連續的記憶體,但結構體內的變數並不一定是連續存放的,這涉及到記憶體對齊。原則1  資料成員對齊規則:結構(struct或聯合union)的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整

C語言結構組遇上typedef

位置 聲明 adjlist tex list 表示 寫上 大型 結構體類型 昨天韓同學在做數據結構題的時候,問了我一個關於typedef 與結構體數組的問題: 1 typedef struct vexnode 2 { 3   int vertex; 4   arcnode

C語言結構佔用空間記憶體大小解析

結構體的資料型別的有點我們就不囉嗦了,直接來看相同資料結構體的幾種書寫的格式吧。 格式一: 01.struct tagPhone 02.{ 03. char A; 04. int B; 05. short C; 06.

C語言結構位元組對齊例項【C語言筆試題】

 一、筆試題目:在一個64位的作業系統中定義如下結構體: <span style="font-family:Microsoft YaHei;font-size:12px;">struct st_task { uint16_t id; uint32

C語言結構位元組對齊原則

為什麼要對齊?     現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體地址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的一個接一個的排放,

什麼是C語言結構位元組對齊,為什麼要對齊?

一、概念     對齊跟資料在記憶體中的位置有關。如果一個變數的記憶體地址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設一個整型變數的地址為0x00000004,那它就是自然對齊的。       二、為什麼要位元組對齊        需要位元

c語言結構大小 sizeof(struct A)

成員 print ble ret 意義 cnblogs () pan color 1,數據類型自身對齊 數據類型的起始地址為其大小的整數倍 2,結構體的自身對齊 結構體的自身對齊值為其中最大的成員大小 3,指定對齊 可以使用關鍵詞#pragma pack(1) 來指定結構體

C語言結構作業

數列 class 系統 過程 函數功能 文字 inf not 類型 一、PTA實驗作業 題目1:6-3 結構體數組中查找指定編號人員 1. 本題PTA提交列表 2. 設計思路 定義一個結構體指針*p for i=0 to i=7 如果std+i的編號與輸入的編號

C語言結構在內存中的存儲情況探究------內存對齊

.com ret size \n str 技術 urn 存儲 typedef 條件(先看一下各個基本類型都占幾個字節): void size_(){ printf("char類型:%d\n", sizeof(char)); printf("in

c語言結構定義的幾種形式

sdn 方法 tps statistic htm def courier ng- target 轉自https://blog.csdn.net/ziguo2010/article/details/79897327 1、最常用定義方式:定義結構體data,

C語言結構字節對齊簡單計算方法

最大的 一個數 數據類型 double short 位操作 結構體字節對齊 根據 struct 1.在C語言裏面每一種數據類型都有字節對齊比如在32位操作系統下:整型的自身對齊數就是 4 字節,字符型就是 1 字節,double就是 8 字節。 但是結構體的計算方式就和普通

C語言結構訓練

結構體大小和記憶體結構 1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 6 //結構體需要根據資料型別進