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 //結構體需要根據資料型別進