首页 > 编程知识 正文

结构体的字节大小怎么计算,c语言结构体大小

时间:2023-05-04 22:01:06 阅读:168772 作者:3175

1 .我们知道结构中元素的地址通常包含许多元素,结构的大小是所有元素大小的总和(包括字节对齐)。

那么,在结构中,不同元素之间地址的相对位置是什么关系呢?

您之前定义的元素地址是位于低地址,还是之后定义的元素地址位于低地址?

用代码测试一下吧。 (我的计算机型号为R9000P、AMD处理器、x86体系结构、windows10操作系统、DevC ) )。

# include stdio.htypedefstruct { inta; int b; (}Test; Test test1; int main () {Test test2; printf(test1的a地址为%d,b地址为%dn )、test1.a、test1.b ); 打印(test 2的a地址为%d,b地址为%dn )、test2.a、test2.b ); 返回0; }运行结构如下图所示

我们一起测试了全局变量和局部变量的情况。

test1存储在全局变量(存储在堆中)中,test2存储在局部变量(存储在堆栈中)中。

所有这些都表明,先定义的元素位于低地址,后定义的元素位于高地址。

2 .大小侧概念(字节大小侧,比特大小侧)例)字节大小侧)内存地址0 x 000040010 x 00040020 x 00040030 x 120 x 340 x 560 x 78大端处理器)此数字在短语处理器:的情况下,该数字为0x78563412; 请用代码测试本机的字节大小侧

# include stdio.htypedefunion { inta; char b[4]; (}Test; int main () {Test test1; test1.a=1; printf(b数组中第四个元素的值为%d ),test1.b[0]; 返回0; }运行结果如下图所示

对于数组,低索引元素位于低地址,正如数组b的第一个元素为1所示,测试计算机是字节的小字节序。

关于二进制数10011101B

存储器内的位置为(LSB ) 10111001 ) msb )时,采用小端序模式; 内存中的位置为(MSB ) 1001101 (LSB )时,进入大端模式。 请继续在代码中测试位的大小侧:

# include stdio.htypedefunion { inta; struct {unsigned int d1:1; unsigned int d:30; unsigned int d2:1; (}bitField; (}Test; int main () {Test test1; test1.a=1; printf(bitfield的值d1为%dn ),test1.bitField.d1 ); printf(bitfield的值d2为%d ),test1.bitField.d2 ); 返回0; }运行结果如下图所示。

运行结果表明,该系统位的大小端为小端序模式,而d1表示最低级别的LSB。

再看一段代码

# include ' stdio.h ' struct kk { unsigned a :2; unsigned b:3; unsigned c:2; unsigned d:1; (kt; int main () { char result=3; memcpy(kt,result,1 ); printf(a=%d,b=%d,c=%d,d=%d,ok/n ),kt.a,kt.b,kt.c,kt.d ); 返回1; 在sun unix上用cc编译时,为0,0,1,1

用2000用VC6.0编译,结果为3,0,0,0

在c语言的位域中,每个字段都严格按照从bit地址的低位到高位的顺序排列。

=====================

-低- -高-

a b c d

=====================

接下来,我们来看看如何解析这个字节。

在little-endian计算机上,result字节中每个位的存储数组如下所示

=====================

-低- -高-

11000000

=====================

支持4个位区域

a=3

b=0

c=0

d=0

在big-endian机器中,结果字节内的各位的存储排列如下

=====================

-低- -高-

00000011

=====================

支持4个位区域

a=0

b=0

c=1

d=1

总结:使用C语言域类型时,各字段的排列顺序为从低位到高位的位顺序。

通过分离数据的存储和分析,可以很容易地说明字节序问题。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。