typedef的用途:


  1. 封装数据类型,方便移植
  2. 简化函数指针的定义


typedef,结构体,共用体,联合体_内存空间

结构体:不同类的型元素汇聚。

(1)、在声明类型的同一时候定义变量:


struct结构体名{


  成员列表


}变量名列表;


 


(2)、直接定义结构体类型变量


struct


{


    成员列表


}变量名表列;


 


指向结构体变量的指针


定义形式:struct结构体名 *结构体指针名;


比如:struct student *p;


#define_CRT_SECURE_NO_WARNINGS  //去掉安全检查


#include<stdio.h>


#include<stdlib.h>       


 


structmydata


{


   intnum;


   charstr[100];


};


 


voidmain()


{


   //int a;


   //int *p;


   //struct mydata *p;


   //printf("%d", sizeof(p));


 


   structmydatamd;  //实例化结构体


   md.num = 99;


   sprintf(md.str,"gogogo");


   printf("md.num=%d,md.str=%s",md.num,md.str);  //打印数据


 


   structmydata *p;  //p存储地址 struct mydata决定了大小还有怎样解析


   printf("\n%d",sizeof(p));


 


   p = &md;//结构体指针初始化,存储地址


   printf("\n(*p).num=%d,(*p).str = %s", (*p).num, (*p).str);


   printf("\np->num = %d,p->str=%s",p->num,p->str);


 


   //指针訪问结构体。第一种方式(*p).成员变量,另外一种p->成员变量


 


   getchar();


}


 typedef,结构体,共用体,联合体_变量名_02


typedef,结构体,共用体,联合体_#include_03

结构体变量:

typedef,结构体,共用体,联合体_#include_04


简单案例:

typedef,结构体,共用体,联合体_内存空间_05


结构体成员地址从低到高连续分配。首成员相应低地址。


 


公用/联合体(union):使用不同类型的变量共占用一段内存(相互覆盖)。次共用体大小为元素中最大字节变量。


 


共用体成员索引:能够通过.成员变量符,也能够通过   à指针索引。        

typedef,结构体,共用体,联合体_#include_06     


union案例


 typedef,结构体,共用体,联合体_内存空间_07


枚举变量:


typedef,结构体,共用体,联合体_#include_08



动态内存申请:

  1. 在内存中申请的。
    malloc()返回的类型是:void *类型的


      2、malloc之后要记着释放,使用free函数。否则会造成内存泄露。导致其他程序不能再使用这块儿内存了。

typedef,结构体,共用体,联合体_内存空间_09


操作系统在管理malloc的时候是一下这样的方式:


//     |    地址        |


//     |     大小        |         


调用malloc的时候,系统每次都会为malloc创建一个节点,并记录本次malloc的首地址和malloc的大小。


 


malloc内存里面申请出来的值是什么值?


在gcc这个编译器下,malloc默认把申请的内存中的初始值变成0,可是在不同的编译器下回有所不同。


 


假设想将malloc中申请的内存的值变成0,能够使用memset(p,0x0,100);假设想使用这个函数。要加上头文件<string.h>


 


calloc()

typedef,结构体,共用体,联合体_#include_10


realloc:当内存不够了时候,能够通过realloc继续申请内存空间。

typedef,结构体,共用体,联合体_内存空间_11

typedef,结构体,共用体,联合体_编译器_12


realloc的实现策略:


  1. 当malloc后面有足够的存储空间。这时候相当于把malloc的首地址不变。仅仅是把malloc的大小改大些。
  2. 假设malloc后面的存储空间不够,那么这时候realloc新开辟一个地址空间,然后将原来malloc的内存里的内存拷贝到新开辟的内存空间中。