C語(yǔ)言深入回顧講解結(jié)構(gòu)體對(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ì)齊)

第一步:確定分配單位(每行開辟多少字節(jié))
結(jié)構(gòu)體中最大的基本類型的長(zhǎng)度 為分配單位。
第二步:確定成員的偏移位置。
偏移位置:成員自身類型的整數(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)體
第一步:確定分配單位(每行開辟多少字節(jié))
所有結(jié)構(gòu)體中最大的基本類型的長(zhǎng)度 為分配單位。
第二步:確定成員的偏移位置。
普通成員偏移位置:成員自身類型的整數(shù)倍(0~n倍)
結(jié)構(gòu)體成員的偏移量:該結(jié)構(gòu)體的最大基本類型的整數(shù)倍
第三步:收尾工作:
結(jié)構(gòu)體成員:是該結(jié)構(gòu)體的最大基本類型整數(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
第一步:確定分配單位(每行開辟多少字節(jié))
min(value,最大的基本類型的長(zhǎng)度) 為分配單位。
第二步:確定成員的偏移位置。
偏移位置:成員自身類型的整數(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)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言示例講解結(jié)構(gòu)體的聲明與初始化方法
- C語(yǔ)言詳細(xì)分析結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則
- 詳解C語(yǔ)言中結(jié)構(gòu)體的使用
- C語(yǔ)言中的自定義類型之結(jié)構(gòu)體與枚舉和聯(lián)合詳解
- C語(yǔ)言結(jié)構(gòu)體數(shù)組常用的三種賦值方法(包含字符串)
- C語(yǔ)言深入講解指針與結(jié)構(gòu)體的使用
- C語(yǔ)言深入探究自定義類型之結(jié)構(gòu)體與枚舉及聯(lián)合
- C語(yǔ)言中結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則講解
- C語(yǔ)言全面梳理結(jié)構(gòu)體知識(shí)點(diǎn)
相關(guān)文章
從匯編看c++中默認(rèn)構(gòu)造函數(shù)的使用分析
c++中,如果為一個(gè)類沒(méi)有明確定義一個(gè)構(gòu)造函數(shù),那么,編譯器就會(huì)自動(dòng)合成一個(gè)默認(rèn)的構(gòu)造函數(shù)。下面,通過(guò)匯編程序,來(lái)看一下其真實(shí)情況2013-05-05
C語(yǔ)言鏈表實(shí)現(xiàn)通訊錄系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鏈表實(shí)現(xiàn)通訊錄系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
C++ LeetCode1775通過(guò)最少操作次數(shù)使數(shù)組和相等
這篇文章主要為大家介紹了C++ LeetCode1775通過(guò)最少操作次數(shù)使數(shù)組和相等,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Ubuntu18.04下QT開發(fā)Android無(wú)法連接設(shè)備問(wèn)題解決實(shí)現(xiàn)
本文主要介紹了Ubuntu18.04下QT開發(fā)Android無(wú)法連接設(shè)備問(wèn)題解決實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
C語(yǔ)言創(chuàng)建數(shù)組實(shí)現(xiàn)函數(shù)init,empty,reverse
這篇文章主要介紹了C語(yǔ)言創(chuàng)建數(shù)組實(shí)現(xiàn)函數(shù)init,empty,reverse,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
C++進(jìn)程的創(chuàng)建和進(jìn)程ID標(biāo)識(shí)詳細(xì)介紹
傳統(tǒng)的C++(C++98)中并沒(méi)有引入線程這個(gè)概念。linux和unix操作系統(tǒng)的設(shè)計(jì)采用的是多進(jìn)程,進(jìn)程間的通信十分方便,同時(shí)進(jìn)程之間互相有著獨(dú)立的空間,不會(huì)污染其他進(jìn)程的數(shù)據(jù),天然的隔離性給程序的穩(wěn)定性帶來(lái)了很大的保障2022-08-08
C++實(shí)現(xiàn)LeetCode(642.設(shè)計(jì)搜索自動(dòng)補(bǔ)全系統(tǒng))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(642.設(shè)計(jì)搜索自動(dòng)補(bǔ)全系統(tǒng)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

