C语言中 struct成员变量顺序对内存的占用

          在C语言的结构体中,是会按照其变量类型来进行分配内存大小的。但是对于不同的编译器,结果是不同的,在VC++6.0中是怎么个分配情况呢?用一下C中的关键字sizeof()来测试下,注意sizeof()不是函数哦!只是关键字而已。下图就是在VC++6.0中的字节分配情况:


下面来分析一下,C中结构体中成员变量的写法,对占用内存的影响。


却发现结果不是13个字节?却是24个字节?为什么呢?哦!肯定是编译起的问题,对,没错,就是编译器的问题,VC++6.0默认是按照成员变量本身类型来对齐的,比如char 占一个字节,就会按照1个字节对齐,short占两个字节,就会按照2个字节对齐,同理,int 4个字节对齐,

默认方式下对齐步骤为:

1.成员变量都按照自己的对齐方式对齐

2.最后整个结构体在按照最大对齐参数对齐 也就是圆整法。

比如上面例子中:第一个成员为int型,所以按照4个字节对齐(第一个成员的偏移值都是0)字节对齐,说白了就是当前的偏移地址必须为n的整数倍,比如4个字节对齐,就是说当前的偏移字节数必须为4的倍数,因为第一个成员都是从offset为0开始的,所以先上4个字节来存Int,然后第二个为double,占8个字节,也就是此时偏移地址,必须为8的倍数,明显前面只有4个字节,不能被8整除,所以必须在填4个字节的空白字节,然后在填充8个字节给ch,最后一个为char类型的,占一个字节,都能被1整除。所以成员变量对齐后,占17个字节。最后为整体对齐,也就是sizeof(stu)的大小了,按照整体的规则,必须为最大对齐参数的整数倍,max(sizeof(int,double,char)=8所以17往上加,第一个被8整除的就是24,所以最后sizeof后为24。

好我们在结构体中把各个结构体成员变量顺序变一下,看下占用多少内存



同理按照上面分析可得到上图所示。

那么程序员如何按照自己的方式来内存对齐呢?用预编译命名

#pragma pack(n)

.......

#pragma pack  中间的代码都将按照n字节来对齐。

具体规则如下:本质和上面两条规则一样

1.各个成员变量按照min(n,sizeof(item))来对齐

比如 int i;这个时候,int占4个字节,n=1,此时就是按照1个字节来对齐的。

2.整体对齐的时候,还是按照最大的对齐参数来对齐。

这里最大的对齐参数为每个成员变量所最大的对齐参数.y=min(maxsizeof(item),n)
可以看出当n=1时,将按照成员变量本身对齐。


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 我可以回答你的问题。一般来说,怀孕6个月已经超过了法律规定的人工流产期限,属于违法行为。同时,这个时候的胎儿已经发育成形,医疗风险也很高,需要进行剖宫产手术。这种手术费用因医院和地区不同而异,一般比较昂贵,具体费用需要向当地的医院进行咨询。但无论费用多少,违法行为都是不可取的,建议妊娠期内妇女应该注意避孕,做好身体保健。 ### 回答2: C语言,非结构体变量和结构体变量之间是不可以直接互换的。 非结构体变量是简单的基本类型变量,如int、float、char等,它们只包含一个值。而结构体变量是由多个不同类型的变量通过定义在一起组成的,代表一个复合的数据类型。 由于非结构体变量和结构体变量的内存分配方式不同,它们的数据表达形式也不同。非结构体变量在内存是连续存放,占用一段连续的内存空间;而结构体变量是由其内部成员变量按照顺序依次存放在内存成员变量之间可能会有空洞。 由于这两种类型的变量的内部数据体现方式不同,所以不能直接互换。当我们希望将一个非结构体变量的值存放到结构体变量时,需要先将非结构体变量的值提取出来,然后将其赋给结构体变量的某个成员变量。同样地,当我们希望将结构体变量的值赋给非结构体变量时,需要提取结构体变量的某个成员变量的值,然后再进行赋值操作。 因此,虽然C语言可以通过一些复杂的操作实现非结构体变量和结构体变量之间的互换,但是不能直接进行互换。 ### 回答3: C语言,非结构体变量和结构体变量之间不能直接互换。因为非结构体变量和结构体变量在内存的存储方式不同,因此不能直接进行赋值操作。 对于非结构体的基本变量类型,例如整型、浮点型等,它们的值可以通过赋值操作相互传递。例如,可以通过将一个整型变量的值赋给另一个整型变量来实现变量之间的互换。 而对于结构体变量,由于其具有多个成员变量,且每个成员变量的类型和长度可能不同,直接进行赋值是不允许的。如果想要互换结构体变量的值,需要通过逐个赋值或者使用memcpy函数等方式进行成员变量的拷贝。 例如,如果有两个结构体变量a和b,它们包含相同的成员变量,可以通过以下方式实现互换: ``` struct MyStruct { int x; float y; char z; }; struct MyStruct a = {1, 2.0, 'A'}; struct MyStruct b; // 使用逐个赋值方式实现互换 b.x = a.x; b.y = a.y; b.z = a.z; // 使用memcpy函数实现互换 memcpy(&b, &a, sizeof(struct MyStruct)); ``` 综上所述,C语言非结构体变量和结构体变量之间不能直接互换,需要根据具体情况使用赋值或者拷贝方式来实现值的传递。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值