用c语言编写学生基本信息(用结构体)拜托啦,急求!

p=&snode;

在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:

c语言结构体对齐 c语言结构体对齐原则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个字节来存储这个变量j

C语言,结构体问题?所占内在字节数,怎么算的???

你的结构体当中,占字节数的变量是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;