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ì)齊)
第一步:確定分配單位(每行開(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)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言示例講解結(jié)構(gòu)體的聲明與初始化方法
- C語(yǔ)言詳細(xì)分析結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則
- 詳解C語(yǔ)言中結(jié)構(gòu)體的使用
- C語(yǔ)言中的自定義類(lèi)型之結(jié)構(gòu)體與枚舉和聯(lián)合詳解
- C語(yǔ)言結(jié)構(gòu)體數(shù)組常用的三種賦值方法(包含字符串)
- C語(yǔ)言深入講解指針與結(jié)構(gòu)體的使用
- C語(yǔ)言深入探究自定義類(lèi)型之結(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++LeetCode數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)詳解
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode數(shù)據(jù)結(jié)構(gòu),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08C++?string如何獲取文件路徑文件名、文件路徑、文件后綴(兩種方式)
這篇文章主要介紹了C++?string如何獲取文件路徑文件名、文件路徑、文件后綴(兩種方式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2023-06-06C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法詳解
這篇文章主要為大家詳細(xì)介紹了C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-03-03Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法
這篇文章主要介紹了Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法,重點(diǎn)講解了圖標(biāo)的繪制技巧,需要的朋友可以參考下2016-04-04C語(yǔ)言實(shí)現(xiàn)經(jīng)典掃雷游戲流程
掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會(huì),幾次調(diào)試之后,發(fā)現(xiàn)這個(gè)比三子棋要復(fù)雜一些,尤其是空白展開(kāi)算法上和堵截玩家有的一拼,與實(shí)際游戲差別較大,不能使用光標(biāo),下面來(lái)詳解每一步分析2021-11-11C++中的三種繼承public,protected,private詳細(xì)解析
我們已經(jīng)知道,在基類(lèi)以private方式被繼承時(shí),其public和protected成員在子類(lèi)中變?yōu)閜rivate成員。然而某些情況下,需要在子類(lèi)中將一個(gè)或多個(gè)繼承的成員恢復(fù)其在基類(lèi)中的訪問(wèn)權(quán)限2013-09-09C++ 字符串string和整數(shù)int的互相轉(zhuǎn)化操作
這篇文章主要介紹了C++ 字符串string和整數(shù)int的互相轉(zhuǎn)化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12