新人问题,有关结构体与共同体内存问题。

0xcode 2019-06-05 09:15:13
#include<iostream> using namespace std; int main() { union un { int i; double y; }; struct st { char a[10]; union un b; }; cout<<sizeof(struct st)<<endl; return 0; } 为什么上面这段代码输出为24,不是应该为18吗? 我对union un 和char a[10]求了内存一个为8一个为10,相加不应该为18吗,为啥做出来是24?
...全文
71 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色盒子 2019-06-05
  • 打赏
  • 举报
回复
char a[10];
union un b;//
内存对齐要求数据地址是数据大小的整数倍,
由于前面已经有10了,而联合体大小是(double)8
所以这里补6,起始地址是16
16+8=24;
24也满足是结构体重数据大小最大的数据(这里是double)的整数倍
liups 2019-06-05
  • 打赏
  • 举报
回复
字节对齐确实不仅针对结构体,是全部
  • 打赏
  • 举报
回复
引用 2 楼 lin5161678 的回复:
链接里面 第一句话就说错了 字节对齐不是结构体特有的 是针对所有对象的 不管是结构体 共用体 还是局部变量 全局变量 字节对齐都会发挥作用
确实有点不准确。 C/C++纯类型也是可以的。不一定是对象。 局部变量,全局变量,和结构体,共用体,是一个级别的概念吗? 类类型也可以。
lin5161678 2019-06-05
  • 打赏
  • 举报
回复
引用 1 楼 zjq9931 的回复:
字节对齐问题。 通过你的情况来看,你的编译器是8字节对齐。 可以利用伪指令 #pragma pack (n) 可以动态的调整内存对齐的方式: #pragma pack (n) // 编译器将按照n个字节对齐; #pragma pack() // 恢复先前的pack设置,取消设置的字节对齐方式 #pragma pack(pop)// 恢复先前的pack设置,取消设置的字节对齐方式 #pragma pack(1) // 按1字节进行对齐 即:不行进行对齐 原文:https://blog.csdn.net/wanxuexiang/article/details/86658855
链接里面 第一句话就说错了 字节对齐不是结构体特有的 是针对所有对象的 不管是结构体 共用体 还是局部变量 全局变量 字节对齐都会发挥作用
  • 打赏
  • 举报
回复
字节对齐问题。 通过你的情况来看,你的编译器是8字节对齐。 可以利用伪指令 #pragma pack (n) 可以动态的调整内存对齐的方式: #pragma pack (n) // 编译器将按照n个字节对齐; #pragma pack() // 恢复先前的pack设置,取消设置的字节对齐方式 #pragma pack(pop)// 恢复先前的pack设置,取消设置的字节对齐方式 #pragma pack(1) // 按1字节进行对齐 即:不行进行对齐 原文:https://blog.csdn.net/wanxuexiang/article/details/86658855
赵4老师 2019-06-05
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD  { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1  { int a; char b[13]; double c;};
#pragma pack(2)
struct A2  { int a; char b[13]; double c;};
#pragma pack(4)
struct A4  { int a; char b[13]; double c;};
#pragma pack(8)
struct A8  { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
    printf("AD.a %d\n",field_offset(AD,a));
    printf("AD.b %d\n",field_offset(AD,b));
    printf("AD.c %d\n",field_offset(AD,c));
    printf("AD sizeof %d\n", sizeof(AD));
    printf("\n");
    printf("A1.a %d\n",field_offset(A1,a));
    printf("A1.b %d\n",field_offset(A1,b));
    printf("A1.c %d\n",field_offset(A1,c));
    printf("A1 sizeof %d\n", sizeof(A1));
    printf("\n");
    printf("A2.a %d\n",field_offset(A2,a));
    printf("A2.b %d\n",field_offset(A2,b));
    printf("A2.c %d\n",field_offset(A2,c));
    printf("A2 sizeof %d\n", sizeof(A2));
    printf("\n");
    printf("A4.a %d\n",field_offset(A4,a));
    printf("A4.b %d\n",field_offset(A4,b));
    printf("A4.c %d\n",field_offset(A4,c));
    printf("A4 sizeof %d\n", sizeof(A4));
    printf("\n");
    printf("A8.a %d\n",field_offset(A8,a));
    printf("A8.b %d\n",field_offset(A8,b));
    printf("A8.c %d\n",field_offset(A8,c));
    printf("A8 sizeof %d\n", sizeof(A8));
    printf("\n");
    printf("A16.a %d\n",field_offset(A16,a));
    printf("A16.b %d\n",field_offset(A16,b));
    printf("A16.c %d\n",field_offset(A16,c));
    printf("A16 sizeof %d\n", sizeof(A16));
    printf("\n");
    return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//AD sizeof 32
//
//A1.a 0
//A1.b 4
//A1.c 17
//A1 sizeof 25
//
//A2.a 0
//A2.b 4
//A2.c 18
//A2 sizeof 26
//
//A4.a 0
//A4.b 4
//A4.c 20
//A4 sizeof 28
//
//A8.a 0
//A8.b 4
//A8.c 24
//A8 sizeof 32
//
//A16.a 0
//A16.b 4
//A16.c 24
//A16 sizeof 32
//
//
#include <stdio.h>
#include <stdlib.h>
char buf[17];
union U {
  unsigned short int aa;
  struct {
    unsigned int bb:7;//(bit 0-6)
    unsigned int cc:6;//(bit 7-12)
    unsigned int dd:3;//(bit 13-15)
  };
} u;
void main() {
                //bbbbbbbbbbbbbbbb
                //iiiiiiiiiiiiiiii
                //tttttttttttttttt
                //111111
                //5432109876543210
                //::::::::::::::::
    u.aa=0xE07F;//1110000001111111
    printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);
    u.bb=0x41;
    u.cc=0x21;//dddccccccbbbbbbb
    u.dd=5;   //1011000011000001
    printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2));
}
//bb==127,cc==0,dd==7
//aa==0xB0C1==1011000011000001(2)

64,690

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧