構造体列挙共用体、サイズ計算

ヒント:記事を書いた後、目次を自動的に生成できます。生成方法については、右側のヘルプドキュメントを参照してください。


1.構造

構造体の宣言。構造体は、メンバー変数と呼ばれる値のコレクションです。構造体の各メンバーは、異なるタイプの変数にすることができます

struct Stu
{
    
    
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
}//分号不能丢

構造の自己参照

typedef struct Node
{
    
    
 int data;
 struct Node* next;
}Node

構造のサイズを計算します

(配置は、
構造内で時間のスペースを使用する効果的な方法ですまず構造の配置ルールを習得する必要があります。

  1. 最初のメンバーは、構造変数からのオフセットが0のアドレスにあります。
  2. 他のメンバー変数は、特定の数(位置合わせ番号)の整数倍であるアドレスに位置合わせする必要があります。
  3. 構造体の合計サイズは、最大配置の整数倍です(各メンバー変数には配置があります)。
  4. 構造体がネストされている場合、ネストされた構造体は最大配置の整数倍に配置され、構造体の全体的なサイズはすべての最大配置の整数倍になります(ネストされた構造体の配置を含む)。
  5. アラインメント番号=コンパイラのデフォルトのアラインメント番号とメンバーサイズの小さい方の値
  6. VSのデフォルト値は8です
struct S2
{
    
    
	char c1; //1
	char c2; //1 + 2
	int i;   //4
};

//16
struct S3
{
    
    
	double d; //8
	char c;   //1 + 3
	int i;    //4
};

struct S4
{
    
    
	char c1;       //1 + 7
	struct S3 s3;  //16
	double d;      //8
};

struct S1
{
    
    
char c1; //1 + 3
int i;   //4
char c2; //1 + 3
};

ネストされたパターンもあります

typedef struct Test
{
    
    
	short a;      //2 + 6
	struct
	{
    
    
		int b;    //4 + 4
		double c; //8
		char d;   //1 + 7
	};
	int e;        //4 + 4
}Test;//40

typedef struct Test
{
    
    
	short a;      //2 + 6
	struct
	{
    
    
		int b;        //4 + 4
		double c[10]; //80
		char d;       //1 + 7
	};
	int e;        //4 + 4
}Test;//112

#pragma pack(2)//可以自指定大小,但不一定是有效值
typedef struct Test
{
    
    
	short a;      //2
	struct
	{
    
    
		int b;        //4
		double c;     //8
		char d;       //1 + 1
	};
	int e;        //4
}Test;//20


ビットセグメント


ビットセグメントとはビットセグメントの宣言と構造は似ていますが、2つの違いがあります
。1。ビットセグメントのメンバーは、int、unsigned int、またはsignedintである必要があります。
2.ビットセグメントのメンバー名の後にコロンと数字があります。

typedef struct Test
{
    
    
	char a : 1; // 0 1  开关值  位域
	char b : 6; // 0 1
	char c : 3; // 0 1=
}Test;//( and b) c  2

typedef struct Test
{
    
    
	char a : 1;
	int  b : 1;
}Test;//8 不同的不能通用,就还是要补齐

ビットセグメントの格納データは、それ自体が作成したスペースにのみ格納され、桁数が格納されていなくても、すぐに切り捨てられます。
メモリ割り当て

  1. ビットセグメントのメンバーは、int unsigned int signed intまたはchar(整数ファミリに属する​​)タイプにすることができます。
  2. ビットセグメントのスペースは、必要に応じて4バイト(int)または1バイト(char)で開かれます。
  3. ビットセグメントには多くの不確実な要素が含まれます。ビットセグメントはクロスプラットフォームではありません。移植性に重点を置いたプログラムでは、ビットセグメントの使用を避ける必要があります。
    クロスプラットフォームの問題
  4. intビットフィールドが符号付き数値として扱われるのか、符号なし数値として扱われるのかは不明です。
  5. ビットセグメントの最大ビット数を特定できません。(16ビットマシンは最大16、32ビットマシンは最大32で、27と記述されているため、16ビットマシンで問題が発生します。
  6. ビットセグメントのメンバーがメモリ内で左から右に割り当てられているか、右から左への割り当て基準が定義されていません。
  7. 構造体に2つのビットセグメントが含まれていて、2番目のビットセグメントメンバーが比較的大きく、最初のビットセグメントの残りのビットを収容できない場合、残りのビットを破棄するか使用するかは不明です。

2、列挙

列挙は、その名前が示すように、1つずつ列挙します。
可能な値を1つずつリストします。

typedef enum TYPE
{
    
    
	ADD,//0
	SUM,//1
	MUL,
	DIV,
	MOD,
	SQU
}TYPE;
void main()
{
    
    
	printf("%d %d %d %d\n", ADD, SUM, MUL, DIV);//0 1 2 3
	printf("size = %d\n", sizeof(enum TYPE));//4
}

番号が与えられると、後者は前の番号に1を追加します。

三、共同

ユニオンも特別なカスタムタイプです。このタイプで定義された変数にも一連のメンバーが含まれます。これらのメンバーが同じスペースを共有するという特徴があります(したがって、ユニオンはユニオンとも呼ばれます)。

関節の特徴

共用体のメンバーは同じメモリ空間を共有します。このような共用体変数のサイズは、少なくとも最大のメンバーのサイズです(共用体は少なくとも最大のメンバーを格納できる必要があるため)。

ジョイントサイズの計算

ユニオンのサイズは、少なくとも最大のメンバーのサイズです。
最大メンバーサイズが最大アライメントの整数倍でない場合は、最大アライメントの整数倍にアライメントする必要があります。

union Test
{
    
    
	int a;
	double b;
	char c;
};

void main()
{
    
    
	printf("size = %d\n", sizeof(union Test));//8
	union Test t;
	t.b = 12.34;
	printf("%f\n", t.b);//12.340000
	t.a = 100;
	printf("%d\n", t.a);
	t.c = 'A';

	printf("%f\n", t.b);//12.3339996
	printf("%d\n", t.a);//65
}

メモリサイズは共有されているため、前のデータは次の割り当て後に変更されます。

おすすめ

転載: blog.csdn.net/weixin_45070922/article/details/110189468