结构体: 用来处理,现实生活中,更复杂的数据的描述
用来 描述复杂数据的 一种用户自定义的数据类型
//结构体类型 定义 --- 定义(从无到有) 声明()
struct 结构体名
{
成员列表
};
(1) struct 表示 这是一个结构体类型
(2) 结构体名 标识符
(3) 成员列表 这个结构类型中要描述的具体数据
一般,都是变量定义的形式
eg:
struct student
{
int sno;
char name[20];
int age;
float score;
}; //此时 表示 定义了一个 学生信息 的 结构体类型
//数据类型 --- 用户自定义
struct student s = {110,"tom",18,98.5};
一般,我们是引用到结构体成员 (引用到这种基本类型)
. //结构体成员运算符
eg:
结构体变量名.结构体成员变量名
s.sno
s.name
s.age
s.score //引用到结构体成员变量
说明: 1. 同一类型的结构体 变量间 可以相互赋值
2. 结构体变量赋值,是赋值给 结构体成员的
结构体的对齐规则: //内存地址的对齐
1.在32位的平台上,默认都是按4字节对齐的。
2.对于成员变量,
各自在自己的自然边界上对齐。
char -- 1字节
short -- 2字节
int -- 4字节
3.如果 成员变量中有比4字节大。
此时 整个结构体 按照4字节对齐。 //32位的平台
4.如果 成员变量中没有有比4字节大。
此时 整个结构体 按照最大的那个成员对齐。
//32位的平台
//如果有超过4字节 ,按照4字节对齐
//如果没有超过4字节的,则按成员变量中最大对齐
----------------------------------------------
//64位的平台 ---- 64位平台 整个结构体对齐, 按成员中最大的对齐
1.结构体成员的对齐 --- 放在自然边界 (偶数位置)
2.结构体整体的对齐 --- 以结构体中最大的成员对齐
typedef struct {
int a;
double b;
short c;
}A; //sizeof(A)=24
typedef struct {
int a;
short b;
double c;
}B; //sizeof(B)=16
1.什么是内存对齐,为什么需要内存对齐?
答:
1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
可以在全局
可以在局部
struct student
{
...
}; //定义了类型 struct student s; //定义了变量
struct student
{
...
}s={...}; //定义了类型
struct
{
...
}s={...}; //定义了类型
//如果该结构体仅仅在你的代码中使用一次,就可以这么定义
//堆区 --- 空间很大,但是需要手动申请,手动释放
功能: 从堆区申请一块内存空间
参数: @size ---说明,要申请的空间的大小
返回值: void * 返回申请到的空间的地址
功能:
释放堆区空间
参数:
pstr //必须是 之前 申请到的堆区内存空间的地址
#include
#include
int main(int argc, const char *argv[])
{
int * p = malloc(sizeof(int));
*p = 10;
printf("*p = %d\n",*p);
printf("%p\n",p);
free(p);
p = NULL;
printf("%p\n",p);
return 0;
}
1.free本身表示将空间释放,就是将空间交还给操作系统,操作系统之后,可以自由安排
2.注意:
free 并不会将释放的空间上的数据清零
3.不能对同一块空间多次free
4.释放掉之后的,空间,不要在使用了
一般将对应的指针变量设置为NULL
//(悬空指针)
在堆区申请空间存放结构体
#include
#include
#include
struct Student{
char name[50];
int age;
char gender[10];
float grade;
};
int main(int argc, const char *argv[])
{
struct Student *s = malloc(sizeof(struct Student));
strcpy(s->name,"tom");
s->age = 18;
strcpy(s->gender,"man");
s->grade = 96.5;
printf(" %s\t", s->name);
printf("%d\t", s->age);
printf("%s\t", s->gender);
printf("%.1f\n", s->grade);
return 0;
}