zoukankan      html  css  js  c++  java
  • 二、动态内存分配与使用

    1.malloc
    (1)malloc分配函数:需要给出申请空间大小(以字节为单位)
    (2)返回值是一个首地址,用指针接收
    (3)使用sizeof计算元素大小
    (4)使用malloc函数申请内存空间,用完后需要释放,否则会造成内存泄露
    (5)释放函数free需要指向分配内存的指针
    (6)基本形式:void *malloc(unsigned int size);
    (7)分配指定大小的内存空间,但是不会把分配的空间清0
    (8)free(指针);//释放堆空间,标记删除,不清楚内容
    (9)示例:
    ①malloc与一维数组
    《1》去*加方括号,指针,数组两变换,无论几维数组,几个*都可以
    《2》随机生成10个整数,保存到堆区
    int *parr = malloc(sizeof(int) * 10);//在堆区开辟10个整型的空间
    for(int i = 0 ; i < 10 ; i ++){
         parr[i] = arc4random()%(100 - 10 + 1) + 10;//生成10个【10,100】的随机数
    }
    for(int i = 0 ; i < 10 ; i ++){
         printf(“%d “,parr[i]);//输出
    }
    printf(“ ”);//换行
    free(parr);//释放申请的空间
    ②malloc与二维数组
    《1》分配2行三列的二维数组
    《2》int (*pa)[3] = malloc(sizeof(int)*2*3);
    int (*pa)[3] = malloc(sizeof(int) * 2 * 3);//开辟一个2行3列的整型空间
    pa[0][0] = 1;//赋值
    pa[0][1] = 13;
    ③malloc与字符串
    《1》将字符串“Hello,Lanou”保存到堆区
    方案一:
    char *pst = malloc(sizeof(char) * 12);//开辟12个char型空间,注意字符串结尾的
    strcpy(pst,”Hello,Lanou”);//拷贝字符串
    printf(“%s ”,pst);//输出
    free(pst);//释放内存
    方案二:
    char a[] = “Hello,Lanou”;//在栈区拷贝常量区的字符串
    char *ps = malloc(sizeof(a));//开辟该字符串大小的空间
    strcpy(ps,a);//将栈区的字符串拷贝到堆区
    free(ps);//释放内存
    ④malloc与字符串数组
    《1》char (*p)[255] = malloc(5 * 255);//开辟5个字符串,每个字符串255字节的空间
    《2》strcpy(p[0],”iPhone”);//拷贝字符串到第一个字符串数组
    ⑤malloc与结构体
    typedef struct person{//创建一个有2个元素的结构体
         char name[20];
         int age;
    }Person;
    方案一:
    int main(){
          Person *pp = malloc(sizeof(Person));//开辟一个该结构体大小的空间
          strcpy(pp->name,”六娃”);//字符串拷贝,赋值
          printf(“%s ”,pp->name);//输出
          pp->age = 34;//整型赋值
          printf(“%d ”,pp->age);//输出
          free(pp); //释放内存
    }
    方案二:
    《根据结构体可以直接赋值的特点》
    Person p = {“贝爷”,20};//先给结构体赋初值
    Person *pi = malloc(sizeof(Person));//开辟一个该结构体大小的空间
    *pi = p;//直接把栈区的结构体的所有值拷贝给堆区的pi
    ⑥malloc与结构体数组
    《1》指针用箭头,结构体数组用点
    《2》3个元素的结构体数组
    方案一:
    Person *pt = malloc(sizeof(Person) * 3);//开辟3个该结构体大小的空间
    strcpy(pt[0].name , “Lanou”);//((pt + 0) ->name),字符串拷贝
    pt[0].age = 10;//给该结构体数组的第一个结构体的一个元素赋值
    printf(“%s ”,pt[0].name);//输出
    free(pt);//释放内存
    方案二:
    Person pt[3] = {{“erdanzi”,23},{“bee”,20},{“liuwa”,30}};
    Person *pp = malloc(sizeof(Person) * 3);
    for(int i = 0 ; i < 3 ; i ++){
         pp[i] = pt[i];//结构间可以直接赋值
    }
    for(int i = 0 ; i < 3 ; i ++){
         printf(“%s %d ”,pp[i].name,pp[i].age);
    }
    free(pp);//释放内存
    2.其他内存分配函数
    ①calloc
    《1》void *calloc(unsigned n , unsigned size);
    《2》使用free释放
    《3》分配n个size大小的空间
    《4》与malloc不同的是calloc申请的内存空间会初始化成0
    《5》不建议使用,容易造成访问越界。C语言没有越界保护,程序员需要自己检查越界
    ②realloc
    《1》void *realloc(void * , unsigned newSize)
    《2》使用free释放
    《3》按给定的地址以及给定的大小重新分配
    《4》从小到大,数据不会丢失
    《5》从大到小,数据可能会丢失
    示例:
    //原来分配的空间
    int *p = malloc(100);
    //重新分配的空间
    p = realloc(p,150);
    3.内存操作函数
    ①meset
    《1》void *memset(void *s , int c , size_t n);
    《2》不仅用于堆区,也用于栈区
    《3》s开始,长度为n的所有字节赋值为c
    《4》通常用于清除结构体或者数组数据
    ②memcpy
    《1》void *memcpy(void *dest , const void *source , size_t n);
    《2》从source拷贝n个字节到dest中
    《3》不仅用于堆区,也用于栈区
    ③memcmp
    《1》int memcmp(const void *buf1 , const void *buf2 , unsigned int count)
    《2》内存比较,比较结果分为>0 , <0 , =0
    《3》既可以用于堆内存,也可以用于栈内存
  • 相关阅读:
    http header Contenttype
    SharePoint 2010 文档库中直接打开文档
    玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
    最近感兴趣的二三事
    最近遭遇的两个VS配置
    环游世界,走遍读过的每一个国家和城镇
    趣题一则:如何快速过桥?
    NASA庆祝地球日:50年地球最精美图片亮相(转载)
    Silverlight,Windows 8应用开发实例教程系列汇总
    Windows 8实例教程系列 数据绑定高级实例
  • 原文地址:https://www.cnblogs.com/gnhxsk/p/5170600.html
Copyright © 2011-2022 走看看