当前位置:首页 » 编程语言 » c语言共用体长度
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言共用体长度

发布时间: 2022-04-03 08:09:38

‘壹’ c语言的结构体类型的长度

strlen是求字符串长度的,string length的缩写嘛
你想求大小的话,可以用sizeof(card);

结构体的大小可是一个非常让人头痛的问题啊。。。我反正还是经常对自己的判断不太肯定
我从别的地方给你找了一个说明,你可以参考一下

在缺省对齐下我先给你说下三条准则吧,
【1】结构体变量的首地址能够被其最宽基本类型成员的大小所整除
【2】结构体每个成员相对于结构体首地址的偏移量是成员大小的整数背
【3】结构体的总大小为结构体最宽基本类型成员大小的整数背
以上都是结构体中只有基本类型时的缺省对齐方式,当有嵌套复合成员时,
【2】改为:复合成员相对于结构体首地址偏移量是复合成员最宽基本类型大小的整数背
所以分析你上面的
typedef struct node
{
int a[100];
char b;
}kkk;
先是第一成员400个字节,然后还有个char一个字节,为了满足第第三条准则,即总大小401为最宽基本类型的整数背,明显401不是最宽基本类型int(4)的整数背,所以总大小为404
希望楼主能理解,呵呵

‘贰’ C语言中,该共用体的大小为何是12

所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:
union 共用体名
{成员表列};

union data
{
int a ;
float b;
doublec;
chard;
}obj;
该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先看一个小例子。

union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*结构体* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
运行程序输出:
15,8
程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。
对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。

可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:
union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
其成员引用为:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。

main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
运行程序输出为:
6
6 7.2
3 4.2,=
程序最后一行的输出是无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“ =”。事实上,字符的输出是无法得知的,由写入内存的数据决定。
例子虽然很简单,但却说明了共用体变量的正确用法。

‘叁’ C语言共用体问题~~

其实union表示里面的三个变量公用一块内存,这里最大的是int(和float一样大),即4个字节,也就是说三个变量公用4个字节,所以最后一次赋值a.i=0x2341;会使得最终着4个字节的值为0x00002341,而char c取得是最有一个字节,即十六进制的41,对应字符就是'A', 而int当然取得就是十六进制的0x2341,转换为10进制就是9025了,对于float,它对应的二进制如下:0 00000000 00000000010001101000001,详细的自己查标准吧。

‘肆’ C语言中共用体变量所占内存长度等于

C语言中共用体变量所占内存长度等于其中长度最长的那个成员的长度

‘伍’ C语言共用体问题

结果是A。
你定义了一个union类型的变量,名字是ts,大小为4个字节;ts可以用来存放int类型和长度为2个字节的char型数组,其实这个union ts类型在的时候只是在这两个类型中选用一个,只是共用了同一块内存地址,并且与它们联系的都是这块内存的首地址罢了。
你下面是给c[0]和c[1]分别赋值A和B,此时与变量i相联系的数据应该是AB,而你在调用printf函数时,是以%c的格式输出变量i里面存的数据,所以只能输出A。

‘陆’ C语言细节:共用体的字节长度问题

union 里的成员 共享 内存。
哪个成员 长度最长,内存大小就 用它决定。
另外,编译器考虑“内存对齐”,32位机上考虑 按32 位对齐,也就是 4 字节 对齐。
需要的最大长度不为4 的整数 倍数 时,给它分配 多1个或2个或3个字节,凑成4 的整数 倍数。

int a; 需内存大小 sizeof(int)
char b[x]; 需内存大小 x * sizeof(char).
M1 = sizeof(int);
M2 = x * sizeof(char).
if (M2 > M1) M = M2; else M = M1;
if (M%4 != 0) M = (M / 4 + 1) * 4;
例如:
x=6; M1=sizeof(int)=4; M2= 6 * sizeof(char) = 6;
M=M2=6;
M%4 = 6%4 = 2; 符合 if (M%4 != 0) M = (M / 4 + 1) * 4 = (6/4+1) * 4 = 8.
结果 8。
例如:
x=7; M1=sizeof(int)=4; M2= 7 * sizeof(char) = 7;
M=M2=7;
M%4 = 7%4 = 3; 符合 if (M%4 != 0) M = (M / 4 + 1) * 4 = (7/4+1) * 4 = 8.
结果 8。
===========
sizeof(test)=4n // 必须 4 字节 对齐, 所以必定是4的整倍数
4(n-1)<=x<=4n // x 的个数,当然 小于等于 总字节数4n, 大于等于 4n-4 个字节数。

‘柒’ c语言关于结构体长度的问题

. 结构体的sizeof这是初学者问得最多的一个问题,所以这里有必要多费点笔墨。让我们先看一个结构体:struct S1{char c;int i;};问sizeof(s1)等于多少聪明的你开始思考了,char占1个字节,int占4个字节,那么加起来就应该是5。是这样吗你在你机器上试过了吗也许你是对的,但很可能你是错的!VC6中按默认设置得到的结果为8。Why为什么受伤的总是我请不要沮丧,我们来好好琢磨一下sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那就让我们来看看S1的内存分配情况:S1 s1 = { 'a', 0xFFFFFFFF };定义上面的变量后,加上断点,运行程序,观察s1所在的内存,你发现了什么以我的VC6.0为例,s1的地址为0x0012FF78,其数据内容如下:0012FF78: 61 CC CC CC FF FF FF FF发现了什么怎么中间夹杂了3个字节的CC看看MSDN上的说明:When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment.原来如此,这就是传说中的字节对齐啊!一个重要的话题出现了。为什么需要字节对齐计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,以此类推。这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。让我们交换一下S1中char与int的位置:struct S2{int i;char c;};看看sizeof(S2)的结果为多少,怎么还是8再看看内存,原来成员c后面仍然有3个填充字节,这又是为什么啊别着急,下面总结规律。字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。对于上面的准则,有几点需要说明:1) 前面不是说结构体成员的地址是其大小的整数倍,怎么又说到偏移量了呢因为有了第1点存在,所以我们就可以只考虑成员的偏移量,这样思考起来简单。想想为什么。结构体某个成员相对于结构体首地址的偏移量可以通过宏offsetof()来获得,这个宏也在stddef.h中定义,如下:#define offsetof(s,m) (size_t)&(((s *)0)->m)例如,想要获得S2中c的偏移量,方法为size_t pos = offsetof(S2, c);// pos等于4

‘捌’ c语言共用体高低字节问题

平时我们用的操作系统
称为小端操作系统
特点是低位保存在低地址中
于是
对于int型,占4个字节,
用来存0x1234的时候,实际存的是0x00001234
而在内存中的顺序是
0x34
0x12
0x00
0x00
所以,这里输出会是
34,12

‘玖’ C语言中共同体的大小是其成员的大小的和对吗

不是,共用体只分配一个内存空间,然后各成员数据存在这一个空间中,相互覆盖。

‘拾’ C语言结构体及长度问题

a四字节对齐,所以应该是16
b是指针,就是4个字节

你那个答案是16位机器,现在上哪找去。。