程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言中結構體內部成員的對齊

C語言中結構體內部成員的對齊

編輯:關於C

說明:

******不同的編譯器和處理器,其結構體內部的成員有不同的對齊方式。

******使用sizeof()運算符計算結構體的長度。

###結構體中每個成員相對於結構首地址的偏移量都是成員大小的整數倍,如果有需要編譯器會在成員之間加上填充字。

###結構體的總大小是結構體最寬基本類型成員大小的整數倍。如果需要編譯器會在最後一個成員之後加上填充字。

struct A
{
	unsigned short a;	//4bytes
	unsigned int b;		//4bytes
	unsigned char c;	//4bytes
}aa;
按結構體成員對齊,應該給c分配一個字節的空間,但是還得按結構體的對齊方式,所以給c分配4個字節。sizeof(aa)==12

結構體成員對齊,應當按結構體中最大基本數據類型來分配存儲空間,例如:當一個成員A分配的空間大於自己本身的大小時,若是下個成員B所需空間,A分配空間的剩下空間足以滿足存儲B的時候,那麼就不會給B分配了,但是,若不能滿足B的存儲的話,會給B按結構體最大數據類型來分配。


###計算結構體某個成員相對於結構體首地址的偏移量,通過宏offsetof()可以獲得。

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
//TYPE:結構體的類型
//MEMBER:結構體中某個成員
/*
 *offsetof(,)宏解析:
 *(TYPE  *)0:將0強制轉換成指向結構體首地址的指針(結構體首地址為0地址)
 *((TYPE *)0)->MEMBER:結構體中某個變量
 * &((TYPE *)0)->MEMBER:取成員變量MEMBER(都是在0地址的基礎上增加的)的地址
 * (size_t) &((TYPE *)0)->MEMBER:將取到的地址強制轉換成size_t數據類型。
 */

結構體變量的初始化:

結構體:

struct A
{
	unsigned short b;
	unsigned int a;
	unsigned short c;
	unsigned short f;
	unsigned short g;
	unsigned short d;
	unsigned char e;
};

第一種初始化方法:

struct A aa={
	.b=2,
	.a=1,
	.c=3,
	.d=4,
	.e=5,
	.f=6,
	.g=7
	};	

第二種初始化方法:

struct A aa={1,2,3,4,5,6,7};

第三種初始化方法:

struct  A aa;
aa.b=2;
aa.a=1;
aa.c=3;
aa.d=4;
aa.e=5;
aa.f=6;
aa.g=7;





  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved