动态分配内存

typedef struct{

  char * name;

  int age;

}Person;

main中

  Person hr;

  scanf("%s %d",hr.name,&hr.age); X

此时会报内存错误,因为char * 是字符串指针,系统默认给我们分配8个字节只是存放指针本身,内存不够我们存不进去

之前定义成数组,是因为定义变量的时候系统会计算到底占多少空间,已经为我们提供好了内存,如果不用动态分配内存就可以这么做


 

动态分配内存

1.定义

  动态分配内存:我们自己向系统申请的内存空间,申请的内存位于栈上,当作用域结束之后系统是不会自动收回内存的。这个内存必须由我们自己去释放。如果不释放,就内存泄露了。

  自动分配内存:当定义以基本类型的变量的时候,系统会为这个变量自动分配内存,这个内存在堆上。当作用域结束,系统会自动将这个内存回收。

  *除非动态分配内存,在处理函数是不要返回地址返回指针,因为已经被系统收回,找不到或者指向错的。

2.什么时候需要分配内存?

  程序运行过程中,需要保存或记录相应的数据,但是又没有提前准备好内存,那么就需要临时动态分配内存。

3.头文件

  #include <stdlib.h>

4.函数

  void *malloc(size_t);

    size_t: 希望申请的内存空间(字节byte)

    void *: 系统一开始不知道你需要存放什么数据,不同的数据需要的内存空间不一样,所以默认就是给一个void *,泛指所有指针类型(char *, int *, struct *)。

    当在使用的时候必须将void *转化为相应的类型。

    如果没有申请成功,那么返回值为NULL。


 

  typedef struct{

    char * name;

    int age;

  }Person;

 

  Person * array[5]={};     //定义了一个结构体指针数组,每一个都指向一个struct结构体的地址,而每个结构体中的name存着一个内存的地址 

  Person * hr =(Person *) malloc(1*sizeOf(Person));  

  if(hr == NULL){       //判断分配空间的行为是否成功

    exit(EXIT_FAILURE);      //分配失败,没有获取指定大小的内存空间,失败了不能再运行,直接退出。

  }else{

    char * pname =(char*) malloc(10*SizeOf(char))

    if(pname ==NULL){

      free(hr);

      exit(EXIT_FAILURE);  

    }else{

      scanf("%s",pname);

    }

    scanf("%d",&(hr->age));

  }

  array[0] = hr; //一个人就存进去了

  free(pname);   //释放小的再释放大的,一定要释放

  free(hr);  

posted @ 2015-12-14 21:05  浪味小仙女  阅读(227)  评论(0编辑  收藏  举报