欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言深入回顧講解結(jié)構(gòu)體對(duì)齊

 更新時(shí)間:2022年06月01日 10:41:18   作者:Bright-SKY  
C 數(shù)組允許定義可存儲(chǔ)相同類(lèi)型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶(hù)自定義的可用的數(shù)據(jù)類(lèi)型,它允許你存儲(chǔ)不同類(lèi)型的數(shù)據(jù)項(xiàng),本篇讓我們來(lái)了解C 的結(jié)構(gòu)體內(nèi)存對(duì)齊

結(jié)構(gòu)體對(duì)齊問(wèn)題

1、知識(shí)點(diǎn)的引入:

struct data1
{
    char a;//1B
    int b;//4B
};
void test01()
{
    printf("%d\n",sizeof(struct data1));//8B 為啥?
}

2、對(duì)齊規(guī)則(默認(rèn)對(duì)齊)

第一步:確定分配單位(每行開(kāi)辟多少字節(jié))

結(jié)構(gòu)體中最大的基本類(lèi)型的長(zhǎng)度 為分配單位。

第二步:確定成員的偏移位置。

偏移位置:成員自身類(lèi)型的整數(shù)倍(0~n倍)

第三步:收尾工作:

結(jié)構(gòu)體的總大小必須是分配單位的整數(shù)倍

struct data
{
	char c;//1B
	int i;//4B
};
void test05()
{
	struct data d;
	//結(jié)構(gòu)體的大小 >= 成員大小之和
	printf("%d\n",sizeof(struct data));//8
	printf("&d.c = %u\n",&d.c );
	printf("&d.i = %u\n",&d.i );
}

運(yùn)行結(jié)果:

案例:

typedef struct
{
	int a;
	char b;
	short c;
	char d;
}DATA;
void test06()
{
	DATA d;
	printf("%d\n", sizeof(DATA));
	printf("%u\n", &d.a);
	printf("%u\n", &d.b);
	printf("%u\n", &d.c);
	printf("%u\n", &d.d);
}

案例1:

struct data1
{
    char a;//1B
    int b;//4B
};

案例2:

struct data2
{
    char a;
    short b;
    char c;
    int d;
};

案例3:

struct data2
{
    char a;
    short b;
    short c;
    char d;
};

案例4:

struct data2
{
    char a[7];
    short b;
    int c;
};

結(jié)構(gòu)體嵌套結(jié)構(gòu)體

第一步:確定分配單位(每行開(kāi)辟多少字節(jié))

所有結(jié)構(gòu)體中最大的基本類(lèi)型的長(zhǎng)度 為分配單位。

第二步:確定成員的偏移位置。

普通成員偏移位置:成員自身類(lèi)型的整數(shù)倍(0~n倍)

結(jié)構(gòu)體成員的偏移量:該結(jié)構(gòu)體的最大基本類(lèi)型的整數(shù)倍

第三步:收尾工作:

結(jié)構(gòu)體成員:是該結(jié)構(gòu)體的最大基本類(lèi)型整數(shù)倍。

結(jié)構(gòu)體的總大小必須是分配單位的整數(shù)倍

案例:

typedef struct
{
	short d;
	char e;
}DATA2;
typedef struct
{
	short a;
	int b;
	DATA2 c;
	char f;
}DATA;
void test08()
{
	DATA data;
	printf("%d\n",sizeof(DATA));
	printf("a:%u\n", &data.a);
	printf("b:%u\n", &data.b);
	printf("c中d:%u\n",&data.c.d);
	printf("c中e:%u\n",&data.c.e);
	printf("f:%u\n",&data.f);
}

案例:

typedef struct
{
	char a;
	int b;
	short c;
}DATA;
void test10()
{
	DATA data={'a',100, 20};
	char *p = &data;
	printf("c = %hd\n", data.c);
	//需求 借助p訪問(wèn)20
	printf("c = %hd\n", *(short *)(p+8));
}

運(yùn)行結(jié)果:

案例:

struct A
{
    char b;
    short c;
};
struct B
{
    int a;
    struct A ob;//結(jié)構(gòu)體成員的偏移量
    int d;
};

案例1:

struct A
{
    short b;
    char c;
};
struct B
{
    int f;
    char a;
    struct A ob;//結(jié)構(gòu)體成員的偏移量
    char d;
};

強(qiáng)制內(nèi)存對(duì)齊

#pragma pack (value)時(shí)的指定對(duì)齊值value

第一步:確定分配單位(每行開(kāi)辟多少字節(jié))

min(value,最大的基本類(lèi)型的長(zhǎng)度) 為分配單位。

第二步:確定成員的偏移位置。

偏移位置:成員自身類(lèi)型的整數(shù)倍(0~n倍)

第三步:收尾工作:

結(jié)構(gòu)體的總大小必須是分配單位的整數(shù)倍

#include <stdio.h>
#include<stdio.h>
#pragma pack (4)
struct stu
{
    char a;
    short b;
    short c;
};
void test01()
{
    printf("%d\n",sizeof(struct stu));//6
}

注意事項(xiàng):

拓展求結(jié)構(gòu)體成員的偏移量

struct stu1
{
    char a;
    int b;
    char c;
    int d;
};

#include <stdio.h>
#include<stdio.h>
struct stu1
{
    char a;
    int b;
    char c;
    int d;
};
#define  OFF_SET(TYPE, member) (int)&(((TYPE *)0)->member)
void test01()
{
    struct stu1 data;
    printf("偏移量:%d\n",   OFF_SET(struct stu1, b) );//8
}

到此這篇關(guān)于C語(yǔ)言深入回顧講解結(jié)構(gòu)體對(duì)齊的文章就介紹到這了,更多相關(guān)C語(yǔ)言結(jié)構(gòu)體對(duì)齊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論