zoukankan      html  css  js  c++  java
  • 动态分配内存

    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);  

  • 相关阅读:
    记录移动端原生开发基础样式
    windows关闭打开应用的时候的安全弹窗
    thinkPad触控板手势安装
    git修改账号密码
    ssh免密登录失效处理
    xxl-rpc remoting error(Connection refused (Connection refused)), for url : http://xxxxxx:19997/run
    utools好用插件分享
    Android Studio打包apk闪退处理
    maven下载jar包失败处理
    微信文件下载位置
  • 原文地址:https://www.cnblogs.com/huoran1120/p/5046552.html
Copyright © 2011-2022 走看看