c-下面这个结构体的内存占用是什么样的,重点是union那里

问题描述

下面这个结构体的内存占用是什么样的,重点是union那里
struct st
{
    char ch,*ptr;
        union
    {
        short a , b;
        unsigned int c : 2 , d : 1;
    };
    bool f;
    struct st *next;
}; 

解决方案

union是共享内存,
一个short是两字节,两个是四字节
int是四字节,刚好两者可以用union

解决方案二:

要根据所用的编译器来,这里以32位编译器作为说明:
ch:1 byte;
ptr: 4 bytes;
a,b,c,d: 共用4 bytes, c和d是位域变量;
bool: cc++里面没这个类型,应该是用typedef定义的自定义类型,一般采用2个字节;
next: 4bytes;

1+4+4+(2)+4=15 bytes;

解决方案三:

union是共享类存的,unsigned int c : 2 , d : 1; 是位段的。位字段没有独立的地址,不能进行取址操作; 位字段没有独立的存储空间,不能进行sizeof()操作。
位字段的内存分配规则:
位字段按声明顺序在机器字内存储。
位字段不能跨越机器字存储,上一个机器字空间不足时,该位字段将全部存到下一个机器字。

那么union那里应该是2个字节。
时间: 2024-09-20 00:00:32

c-下面这个结构体的内存占用是什么样的,重点是union那里的相关文章

《从缺陷中学习C/C++》——6.16 结构体成员内存对齐问题

6.16 结构体成员内存对齐问题 从缺陷中学习C/C++ 代码示例 struct{ char flag; int i; } foo; int main() { foo.flag = 'T'; int pi = (int )(&foo.flag + 1); *pi = 0x01020304; printf("flag=%c, i=%x\n", foo.flag, foo.i); return 0; } 现象&后果 代码中定义了一个结构体,包括一个字符成员flag和整型成员

详解C语言中的内存四区模型及结构体对内存的使用_C 语言

内存四区 1.代码区代码区code,程序被操作系统加载到内存的时候,所有的可执行代码都加载到代码区,也叫代码段,这块内存是不可以在运行期间修改的.2.静态区所有的全局变量以及程序中的静态变量都存储到静态区.3.栈区栈stack是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用域时,自动从栈中弹出.对于自动变量,什么时候入栈,什么时候出栈,是不需要程序控制的,由C语言编译器.实现栈不会很大,一般都是以K为单位的. 当栈空间以满,但还往栈内存压变量

C/C++语言中结构体的内存分配小例子_C 语言

当未用 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度对齐:当使用了 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度和 #pragma 指令指定的位数中的较小值对齐. #pragma 指令格式如下所示:#pragma pack(4)     // 或者 #pragma pack(push, 4) 举例如下:(机器字长为 32 位)    struct    {        char a;    }test;    printf("%d

结构体占用内存大小计算

问题描述 结构体占用内存大小计算 第一个我理解为 和 double对齐是16 第二个 是 4*3 = 12 第三个理解为 (1+7)+8= 16 第四个 8* 3 =24: 和运行的出来的结果完全不对啊,,看了好几篇 对齐的文章,,把文章示例抄过来运行都是错的.....感觉我这块理解有 严重误区啊 解决方案 看上去编译器像是4字节对齐,double占两个单位 4+8 4+4+4 4+8 4+8+4 解决方案二: 结构体占内存大小计算struct结构体占内存大小计算struct结构体占内存大小计算

C++ DLL接口结构体的转寰问题,究竟字符串内存的分配是怎样的

问题描述 C++ DLL接口结构体的转寰问题,究竟字符串内存的分配是怎样的 为什么VB6.0不需要释放内存,而同样的结构体在C++ DLL使用,C++自己反倒需要释放内存呢?字符串有什么不同? 解决方案 http://blog.csdn.net/jiftlixu/article/details/5351741 解决方案二: 结构体的内存对齐问题 解决方案三: VB和C++的思想完全不同,不建议进行对比.C++中的字符串需要看定义方法,定义成char数组的不需要释放内存,定义成char*则需要.V

关于vb.net结构体(structure)在内存空间存储的问题

问题描述 <StructLayout(LayoutKind.Auto)>_PublicStructuredc_msg<VBFixedArray(IMEI_LEN+1)>PublicImeiDTU()AsByte<VBFixedArray(DTU_NAME+1)>PublicNameDTU()AsBytePublicmsg_typeAsBytePublicreservedAsBytePublicmsg_lenAsShort<VBFixedArray(MAX_MSG_

C++动态分配和撤销内存以及结构体类型作为函数参数_C 语言

C++动态分配内存(new)和撤销内存(delete) 在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数. 注意: new和delete是运算符,不是函数,因此执行效率高. 虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算

【C语言】关于结构体最后的长度为0或1数组的思考

需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,这个仅仅是GNU C的扩展,gcc可以允许这一语法现象的存在.但最新的C/C++不知道是否可以,我没有测试过.(C99允许.微软的VS系列报一个WARNING,即非常的标准扩展.) 结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申

visual c++6.0 结构体占存字节的疑问

问题描述 visual c++6.0 结构体占存字节的疑问 程序1: #include int main(void) { struct stu { double a; int b; }tex; printf("%d %d %d n", sizeof(stu), sizeof(tex.a), sizeof(tex.b) ); return 0; } 结果:16 8 4 //疑问:为什么 sizeof(stu) 不等于 sizeof(tex.a)和 sizeof(tex.b) 的和 12