c语言结构体对齐 c语言结构体对齐原则
用c语言编写学生基本信息(用结构体)拜托啦,急求!
p=&snode;在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:
c语言结构体对齐 c语言结构体对齐原则
c语言结构体对齐 c语言结构体对齐原则
float score; //成绩
struct 结构体名{
结构体所包含的变量或数组
};
结构体是一种,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。请看下面的一个例子:
struct stu{
char name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
};
stu 为结构体名,它包含了 5 个成员,分别是 name、num、age、group、score。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化。
注意大括号后面的分号;不能少,这是一条完整的语句。
结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据。
像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。
结构体变量
既然结构体是一种数据类型,那么就可以用它来定义变量。例如:
struct stu stu1, stu2;
定义了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 5 个成员组成。注意关键字struct不能少。
stu 就像一个“模板”,定义出来的变量都具有相同的性质。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的。
你也可以在定义结构体的同时定义结构体变量:
struct stu{
char name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
将变量放在结构体定义的即可。
如果只需要 stu1、stu2 两个变量,后面不需要再使用结构体名定义其他变量,那么在定义时也可以不给出结构体名,如下所示:
struct{ //没有写 stu
char name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
这样做书写简单,但是因为没有结构体名,后面就没法用该结构体定义新的变量。
理论上讲结构体的各个成员在内存中是连续存储的,和数组非常类似,例如上面的结构体变量 stu1、stu2 的内存分布如下图所示,共占用 4+4+4+1+4 = 17 个字节。
但是在编译器的具体实现中,各个成员之间可能会存在缝隙,对于 stu1、stu2,成员变量 group 和 score 之间就存在 3 个字节的空白填充(见下图)。这样算来,stu1、stu2 其实占用了 17 + 3 = 20 个字节。
关于成员变量之间存在“裂缝”的原因,我们将在《C语言和内存》专题中的《C语言内存对齐,提高寻址效率》一节中详细讲解。
成员的获取和赋值
结构体和数组类似,也是一组数据的,整体使用没有太大的意义。数组使用下标[ ]获取单个元素,结构体使用点号.获取单个成员。获取结构体成员的一般格式为:
结构体变量名.成员名;
通过这种方式可以获取成员的值,也可以给成员赋值:
#include
int main(){
struct{
char name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
} stu1;
//给结构体成员赋值
stu1.name = "Tom";
stu1.num = 12;
stu1.age = 18;
stu1.group = 'A';
//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
return 0;
}运行结果:
Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!
除了可以对成员进行逐一赋值,也可以在定义时整体赋值,例如:
struct{
char name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
} stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };
不过整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。
C语言联合体和结构体中变量所占内存
共用体:结构体的首地址是为C语言中的特殊类型指针变量服务的。
sizeof(union data1)的值为16.在编译器默认设置的情况下,该共用体基本类型为double,它占8字节,所以此共用体以8来对齐。字符数组c2占9个字节,那么整个共用体应该占9个字节,但按照对齐原则,实际分配给它的内存为16字节。
结构体:
union的内存大小由其占有内存的成员决定,所以union U{char st[4];int i ;};的字节数是4个字节。结构体所占内存由所以成员的字节数相加,所以a的大小为1+4=5.给分吧
union U
{char st[4];//4
int i ;};//2
//总共4
struct A
{ int c; //Uu;2
}a;//总共6
如果有turbo C自己用sizeof看一下也行,如果没有turbo C千万不要用sizeof
C语言结构体所占用的字节数如何计算
处理成这个比较复杂:
1.数据类型不同,计算方法更繁琐
2.需要考虑字节对齐的问题,这是重点!!
3.可以自定义字节对齐的字节数
具体的可以寻找相关文档
你好,这涉及到字节对齐} stu1, stu2;的问题。
c语言中为struct分配内存空间是否一定是连续空间?
当然是连续的空间,可以用memory copy。不仅一个struct,就是多个struct的数组也是连续的空间。
这个得看是编1、先算struct的对齐大小,对齐的大小也是取决于struct成员中字节对齐的那个;在给的题目中就是int类型,也就是4byte。如果结构体成员小于4byte,需要补齐填满4byte译器吧。C语言本身并没有规定struct的内存空间是否一定要连续,但是很多编译器char比如VC、VS,在实现的时候,都是为struct分配连续的内存空间。
用#pragma pack(1)让成员1字节对齐,就可以不让有任何插值,就可以连续了
c语言这个程序输出结果为什么是24?
//像有一些收入的程序,他的那个代码以及她的那个最终数据都是这样子的
因为C++允许使用位域,char j: 4; 后面的4表示使用4个字节来存储这个变量jC语言,结构体问题?所占内在字节数,怎么算的???
你的结构体当中,占字节数的变量是double类型,是8个字节,所以这个结构体的大小是以8字节来对齐的,也就是它的大小是8的整数倍。再来看成员变量的大小:ch[10]占了10个字节,再加上变量i的大小就是14字节,但是再加上指针变量p的大小(4个字节)的时候,成了18,它不是8的倍数(也就是没有字节对齐),所以ch[10]和变量i一共占16个字节,然后指针p占8个字节(p本身只占4个字节,但是加上后面的k的话一共是12个字节,没有字节对齐,所以单独为它分配了8个字节的空间),k也占了8个字节,所以它的大小应该是16+8+8=32
结构体所占内存大小为结构体各成员变量所占内存大小之和
本例共32字节
对于结构体stuct的大小计算:
2、个char类型虽然只有1byte,但是为了4byte对齐,也需要填充为4byte。所以总的大小就是4+4+100 = 108
扩展一下,如果结构体为
struct student
{char ;
char a;
char b;
int age;
char name[100];
short};
结果是108
有个对齐问题,如果是4字节对齐的,32位系统
那么 ch[10] 占用前十个字节(0 - 9),
int p 占用4字节(16 - 19)
double k占用8字节 (24- 31)
因此,总共是32个字节
有字节对齐现象。如一个成员占1个字节,后面有long就要添一个额外的字节凑足2字节,有些系统要添额外的3字节凑足4字节。总之结构体占总字节数是2的整数倍或4的整数倍。例如占19个字节是不可能的,必须占20个字节
10+2+4+8+8=32;
2是为了凑4的整数倍浪费掉的
p占8个字节
结构体的C语言中的结构体
这个是叫内存对齐,编译器自动优化的,因为都4的倍数很方便在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。 结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。 struct tag { member-list } variable-list ; 在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。以下为示例: //此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c//同时又声明了结构体变量s1//这个结构体并没有标明其标签struct { int a; char b; double c;} s1;//同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c//结构体的标签被命名为SIMPLE,没有声明变量struct SIMPLE{ int a; char b; double c;};//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3struct SIMPLE t1, t2[20], t3; //也可以用typedef创建新类型typedef struct{ int a; char b; double c; int i: 8; 这是什么啊} Simple2;//现在可以用Simple2作为类型声明新的结构体变量Simple2 u1, u2[20], u3;在上面的声明中,个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令t3=&s1,则是非法的。
c语言 结构体 共用体 占内存字节
float score; //成绩结果应该是12。
共用体所占的字节为各成员中占字节最多的成员的字节:
union
U{
/4个字节/
i;
/4个字节/
long
l;
/4个字节/
}为了对齐,int i占用四字节(12 - 15);
结构体所占字节为各成员字节相加之和:
struct
A{
union
/4个字节/
double
c;
/8个字节/
}a;
你要看看每个变量的字节对齐方式:这是这题的重点
联合体:的大小是联合体中的那个变量的占用空间,因此上述联合体大小为4
结构体中,在内存分配空间时,首先分配联合体的空间4字节,然后当要分配double时,发现double的字节对齐方式是8字节对齐,因此double
c变量不会紧着接联合体的那个变量分配空间,而是会在联合体后空出4字节,然后分配,因此得到16字节=联合体4字节+空的4字节+double8字节
但是如果改成int
,int的字节对齐方式是4字节,联合体占用4字节,其后恰好是4字节边界,因此如果用int
则会在联合体后直接分配空间,就会得到8字节的大小
为什么整个结构体的内存大小输出了是12,而不是9? C语言
short因为内存对齐,也就是说按整形的整数倍存的,不足一个整形按一个整形存
struct定义的结构体,所占用的内存空间要向结构体内元素空间看齐(在这里是flounion U u ;//4at,float占4个字节),也就是说,char元素会扩充字节来与他看齐
c语言 结构体变量的首地址是什么??作用是?
结构体变量的首地址,是指结构体变量在内存存储中,起始的地址值。在C语言中,对于任意的结构体变量a,可以通过&a来获取首地址。
指针变量存储的实际值即为地址,所以对指针int i; /4个字节/变量赋值时,常见的方式就是
p = &a;
#include
int main()
{struct node
{int data;
struct node next;
}所以sizeof(a)应该为12个字节。snode;
struct node p;
return 0;
}上面定义了一个单链表结构体node,它有2个变量,其中p就是指针变量
如p->data=5
首地址是结构体个成员所占的个内存单元的地址。作用当然是让编译系统能找到结构体数据在内存中的位置啦!
C语言中的结构体问题 为什么输出的都是24 不是17吗? 还有书上的是 ss1:16 ss2:24 ss3:32
数据对象的存储安排深受目标机器寻址方式的影响,存在对齐问题。
例如,要求整数int,long等的相对地址可以被4整除。
struct s1
{int i: 8name[10];;
char j: 4;
int a: 4;
double b;
}ss1; int占4字节 char本身是1字节,但会分配4字节内存 int4字节,long16字节所以是24字节
ss2和ss3解释和ss1等同
sizeof(s1)=12
sizeof(s2)=16
sizeof(s3)=20
int=4
double=8
char=1
----------------------------------------
呵呵,你的只所以是24,是int因为做了:内存对其。
你可查查内存对其的相关资料。
以上对你有帮助的话,请给点分哦,谢谢!
因此是24个字节。
char j: 4; 这是什么啊
double b;
int a: 4; 这是什么啊
}ss2;
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。