sizeof(结构体)的计算】的更多相关文章

摘要: 经常被计算结构体的sizeof给搞晕,于是找了个时间,静下心来,搞定它. 一.为什么结构体计算这么乱? 答案是字节对齐,计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如:整型(int)数据占4个字节,字符型(char)数据占一个字 节, 短整型(short)数据占两个字节,等等.计算机为了快速的读写数据,默认情况下将数据存放在某个地址的起始位置,如:整型数据(int)默认存储 在地址能被 4整除的起始位置,字符型数据(char)可以存放在任何地址位置(被1整除),…
Win32平台下的微软C编译器的对齐策略: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址.将这个最宽的基本数据类型的大小作为上面介绍的对齐模数. 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节: 备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相…
规则1:结构体的对折长度为其基本数据成员的长度的最大值. 规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者. 规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数倍. 规则4:嵌套取对折长度的情况,里层结构体作为一个变量. · 使用伪指令 #pragma pack (n) ,指定n字节对齐. · n的有效值为1.2.4.8.16等,当n=1时,结构体长度为自成员变量长度相加. · 使用伪指令 #pragma pack () ,取消指定. #include <…
#include <stdio.h> struct time{ int year; int month; int day;}; int main(void) { struct time s1; int n; while(scanf("%d-%d-%d",&s1.year,&s1.month,&s1.day)!=EOF) { ==||s1.year%==) { ) printf("%d\n",s1.day); ) printf();…
结构体字节对齐准则: 1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2. 结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节: 3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节. 4. 在嵌套结构中需要把内部‘打散'后再进行对齐计算. // sizeof(结构体).cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #inc…
一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #include<stdio.h> #include<string.h> using namespace std; typedef struct { int a; char b; }A_t; typedef struct { int a; char b; char c; }B_t; typedef…
1)枚举类enum型空间计算 enum只是定义了一个常量集合,里面没有“元素”,而枚举类型是当做int来存储的,所以枚举类型的sizeof值都为4 enum color(red,pink,white,black)c; void main() { cout<<sizeof(enum); //值为4 } 2)公用体union空间计算 公用体中的成员公用同一段内存,所以整个联合体的sizeof是所有成员中占用内存最大的成员的sizeof,联合体要考虑内存对齐,具体规则下面会讲 union st{ ]…
sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的头文件stddef.h的C++版本.他是一个和机器相关的unsigned类型,其大小足以保证内存中对象的大小. 1.什么是sizeof 首先看一下sizeof在msdn上的定义: The sizeof keyword gives the amount of storage, in bytes, as…
结构体与共用体的sizeof 结构体的sizeof 结构体变量占用的内存空间大小通常是其基本类型的大小,但是由例外(字节对齐机制) struct S1{ char c[5]; int a; double d; char c2; }; /*最大基本类型为8:也就是说字节对齐大小为8 c5 _ _ _ a _ _ _ _ d c2 _ _ _ _ _ _ _ 所以sizeof(S1)的大小为32 */ struct S2{ char c[5]; int a; char c2; double d; }…
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B;sizeof( A)=6, sizeof( B)=8,为什么?注:sizeof(short)=2,sizeof(long)=4 因为:“成员对齐有一个重要的条件,即每个成员按自己的方式对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里默认是8字节)中较小的一…
逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合 2.在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类. 3. 结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据结构.结构体同时也是一些元素的集合,这些元素称为结构体的成员(member)…
1.枚举 枚举类型的声明形式为:   enum  枚举类型名   {  变量值列表 };    变量值列表里都是整型变量,另外不要忘记最后面的分号! 比如,enum  weekday   { sun,mon,tue,wed,thu,fri,sat }; 这里的枚举元素sun.mon...都没有指定值,它们就使用默认值,依次为0,1,2....即sun就是0,mon就是1,...sat是6.也可以在声明枚举类型时指定枚举元素的值,比如 enum  weekday  { sun=7, mon=1,…
点击进入项目 一.Python生成C语言结构体 C语言中的结构体传给Python时会被封装为胶囊(Capsule), 我们想要一个如下结构体进行运算,则需要Python传入x.y两个浮点数, typedef struct Point { double x,y; } Point; 然后对这两个浮点数解析后生成C中Point的结构体,如下, /* Create a new Point object */ static PyObject *py_Point(PyObject *self, PyObje…
所谓的求成员大小, 是求成员在该结构体中 用 sizeof(结构体名.结构体成员名) 求来的. 很多时候我们需要知道一个结构体成员中的某个成员的大小, 但是我们又不需要定义该结构体类型的变量(定义的话会让人难以理解, 又没有实际的作用, 干嘛要定义?). 考虑可以用指针来反求, 比如有一个 POINT 类型的指针 pPoint, 那么: sizeof(pPoint->x) 即为 x 成员的大小, 由于 sizeof 是在编译时刻求值, 且 sizeof 不会对其表达式求值计算, 只判断类型(当然…
1.字符串输出输入函数 读入字符串的方法: 1) scanf 特点:不能接收空格 2) gets 特点:可以接受含有空格的字符串 ,不安全 3) fgets(); 特点:可以帮我们自动根据数组的长度截取适当的长度保存,安全 如果输入的长度大于数组的长度,自动将数组最后一个元素保存为\0 如果输入的长度小于数组的长度,会自动先保存\n,再保存\0   使用格式:fgets(ch,sizeof(ch),stdin); 输出字符串的方法: 1) printf() %s   缺点:不能自动换行 2) p…
为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他…
关于内存对齐 一: 1.什么是内存对齐 假设我们同时声明两个变量: char a; short b; 用&(取地址符号)观察变量a, b的地址的话,我们会发现(以16位CPU为例): 如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004. 那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了?答案就是它确实没被使用.因为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的.如果变量b的地址是0x0001的话,那…
2578: 分数减法--结构体 时间限制: 1 Sec  内存限制: 128 MB 提交: 522  解决: 399 题目描述 分数可以看成是由字符'/'分割两个整数构成,可以用结构体类型表示.请用结构体类型变量计算两个分数的差. 注意:不考虑约分,只考虑大数减小数,分母相同的情况. 输入 两行,每行一个分数. 输出 两个分数的差. 样例输入 2/7 1/7 样例输出 1/7 提示 //以下代码会添加到程序的结尾 //C语言 int main() {     struct fenshu a,b;…
1. 结构体的sizeof 题目: sturct aa{ in num; char name[10];}; struct bb{ int a; float b; struct aa c;}; struct bb a; 计算 sizeof(a) 的值 ---------------------- 计算过程: 结构体a为bb类型,计算sizeof(a),就是将bb类型中,所有的成员的sizeof求总和.如果有数组,则乘上数组的长度. 所以1. bb 中a的长度 2(int):2. bb 中b的长度…
简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大小相加,而是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题. 一.没有成员的结构体占用的空间是多少个字节? 答案是:1个字节. 这就是实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类或空结构体(C++中结构体也可看为类)隐含的加一个字节,这样空类或空结构体在实例化后在内存得到了独一无二的地址,所以空类所占的内存…
//计算结构体偏移量 #include<stdio.h> #include<stdlib.h> #include<string.h> //详解:对于offscfof()函数, //(TYPE *)0这句的意思是将内存地址是0内存块转换成一个TYPE类型的指针 //那么此时0地址的指针的步长就是TYPE, //(TYPE *)0)->MEMBER这句话是取TYPE结构体的MEMBER属性(注意此时TYPE结构体的指针的值是0) //&((TYPE *)0)-…
(一)结构体指针定义 今天上班写了一段测试代码,结果在linux下编译出现段错误,刚开始一直找不到原因,后来找了度娘才搞懂了.我先贴出来第一次写的代码以及gcc编译器下报的错误: #include<stdio.h> typedef struct { int a; char str; int b[5]; }St; int main() { St * Ds; Ds -> a = 5; Ds -> str = 'a'; Ds -> b[5] = 2; printf("a…
sizeof测类型(数组名除外) strlen测实际长度 strncpy返回指针类型 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *p="wangddd"; printf("%d\n",sizeof(p));//输出4,指针类型 ]; printf("%d\n",sizeof(x));//输出8,所占内…
导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2. sizeof作用于结构体 3. 字节对齐问题 4. sizeof作用于类 正文 1. sizeof与strlen的区别 这是老生常谈的问题了,下面举一个例子大家就明白了. char buf[] = "hello world!"; cout<<sizeof(buf)<&…
首先有几条规则: 1. 结构体的成员相对于结构体的偏移量,是该成员所包含的最大简单类型(指占用内存数)的整数倍(如果该成员本身又是一个结构体,就要递归查找其简单类型,简单类型就是char short int float double,long) 比如struct a1{ char a[5]; int b; }aa; struct a2{ double a; char b; a1 c; char d; }bb; 此例中,aa.b相对于aa的偏移值是int的整数倍,所以aa.b的偏移值是8,aa.a…
说明: 结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题.这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,一.解释 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 各个硬件平台对存储空间的处理上有很大的不同.一些平…
sizeof和strlen区别 sizeof是关键字,在编译时就能计算出值,可以计算任何类型 strlen是函数,只有在运行时才能去计算,且只能计算字符型的. 对于数组时,strlen是判断’\0’为标志结尾的,而sizeof则计算的是数组整个空间示例如下: char buf1[]="abcde"; ]="ABC"; printf("buf1: %d %d\n",sizeof(buf1),strlen(buf1)); printf("b…
C语言类型大小总览 编译器pack指令 #pragma pack(n)——定义n字节对齐 C++固有类型的对齐取编译器对齐与自身大小中较小的一个 32位C++默认8字节对齐.gcc编译器默认4字节对齐 static变量在静态区,sizeof均不纳入计算 在编译阶段处理,sizeof作用范围内的内容不能被编译,所以sizeof()内的运算不被执行 sizeof(函数)=sizeof(返回值类型) sizeof和strlen:sizeof计算字符串容量,算’\0’,strlen计算字符串长度,到’\…
C 语言中同意将值为 0 的变量强制转换成任一类型的指针,转换结果是一个NULL指针. (type*)0 // 一个 type 类型的NULL指针 用这个指针訪问结构体内的成员是非法的,可是 &(((type*)0)->field) 是为了计算 field 的地址 ,编译器不会产生訪问 field 的代码.仅仅会依据 type 的布局和起始地址在编译期计算这个地址(常量).而又由于初始地址为 0,故该地址的值就是该结构体成员相对于结构体基址的偏移. (size_t)&(((type*…
关于结构体大小怎样计算的文章,我想网上一搜到处都有人总结,本人之所以在此基础上还要发表这样的文章是想用最简单的计算方法来总结前人给出的结论,以致我们在以后在对结构体相关编程中不会陷入字节对齐的陷阱中.想必想弄清楚这个问题的小伙伴都迫不及待了吧,废话不多说,下面分析过程. 首先大家应该知道有个叫默认对齐字节的概念吧,#pragma pack(n) 在代码中可以手动设置默认对齐字节的大小为n,VS编译器 n只能为(1.2.4.8.16).默认为8 ,可以通过#pragma pack(show) 来看…