日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

结构体问题

發布時間:2024/4/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结构体问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.結構體非空問題

結構體在C語言里不允許是空的(但是在C++允許,而且是一字節大小)。一般情況下都說在C++里結構體和類沒什么區別,但是在網上搜一下,發現深究還是有區別的(結構體與類區別優秀博客點擊這里)。

2.求解結構體大小問題

1.先確定實際對其單位。
CPU周期、結構體最大成員、預編譯指令(#pragma pack(n)手動設置n,只能填1 2 4 8 16)三者中最小的為實際對齊單位。
一般32位系統默認4字節對齊,64位系統默認8字節對齊。
2.除去結構體第一個成員外,其他所有成員的地址相對于結構體地址(第一個成員地址)的偏移量必須為實際內存對齊單位或自身大小的整數倍(取兩者中較小的為基準)。
3.結構體整體大小必須是實際對齊單位的整數倍。
我們下面用示例說明:

#include<stdio.h> //系統32位 struct S {char a;short b; };//4 short地址偏移要是2的倍數,所以和char之間空一字節,總共4字節struct A {char a;//1+3int b;//4 };//8 int地址偏移要是4的倍數,所以和char之間空3字節struct B {char a;//1+1short b;//2int c;//4 };//8 short地址偏移是2的倍數,所以和char之間空1字節,int地址偏移是4的倍數,前面char和short正好4字節,不需要空字節struct C {char a;//1+3int b;//4float c;//4+4double d;//8 };//24 char放過后,int地址偏移要是4的倍數,char會空三字節,后面double8字節,起始地址偏移要是8的倍數,所以前面占12字節,所以空出來4字節struct D {char a;//1+3int b;//4short c;//2 };//10+2 int4字節,起始地址偏移要是4的倍數,所以和char空3個字節,short地址偏移要是2的倍數,前面占8字節,不需要空字節struct E {int a;//4char b;//1 };//5+3 int4字節,char1字節,不需要和int之間有空字節,但是由于整個結構體要是實際對齊單位(4)的整數倍,所以char后空3字節struct F {char a;struct FF{char b;double c;};//16int d; };//32 FF的成員b和c之間空7個字節,b地址偏移量是結構體FF中成員最大的整數倍,所以a后面空了7字節,//最終需要是變量最大(double)的整數倍,所以int后空4字節struct F2 {char a;double b;double c;int d; };//32struct G {char a;char b;char c;int d; };// 8 前三個字節正常放,不需要空字節,但是int地址偏移需要是4的倍數,所以和第三個char后面有一個空字節int main() {printf("S大小:%d\n", sizeof(struct S));printf("A大小:%d\n", sizeof(struct A));printf("B大小:%d\n", sizeof(struct B));printf("C大小:%d\n", sizeof(struct C));printf("D大小:%d\n", sizeof(struct D));printf("E大小:%d\n", sizeof(struct E));printf("F大小:%d\n", sizeof(struct F));printf("F2大小:%d\n", sizeof(struct F2));printf("G大小:%d\n", sizeof(struct G));return 0; }

總結

以上是生活随笔為你收集整理的结构体问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。