zoukankan      html  css  js  c++  java
  • 使用malloc和free函数进行内存动态分配

                     一、在学习c语言里面,内存分配这个话题非常有意思,因为我们平时在开发的时候,如果一不小心没注意内存释放的话,写的的程序很容易出错,所以今天就来回顾一下c语言里面的内存动态分配,下面我们先来看一个实例来进行分析

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 int main(void)
     4 {
     5     int a[5] = {4, 10, 2, 8, 6};
     6     int len;
     7     printf("请输入数组的长度大小:len= ");
     8     scanf("%d",&len);
     9     int * pArr = (int *)malloc(sizeof(int) * len);
    10     *pArr =4;
    11     pArr[1] =10;a
    12     printf("%d %d
    ", *pArr, pArr[1]);
    13     free(pArr);
    14 
    15     return 0;
    16 }

    程序代码说明:

            1、(int *)malloc(sizeof(int) * len)这句话的意思是:

                    a、这里使用了函数sizeof返回数据类型为int 的数组字节个数,同时这里要注意我们这里写的malloc函数只有一个形参,表示要求系统分配的字节数

                    b、malloc函数的功能是请求系统sizeof(int) * len个字节的内存空间,如果请求分配成功的话,则返回第一个字节的地址,如果分配不成功的话,则返回NULL。

                    c、malloc函数能且只能返回第一个字节的地址,所以我们需要把这个无实际意义的第一个字节的地址(俗称干地址)转化为有实际意义的地址,所以malloc函数前面必须加(数据类型  *),表示把这个无实际意义的地址转为相应数据类型的地址。

                   d、所以这里这句话的意思是把系统分配好的20个字节的第一个字节的地址转为四个字节,这样p就指向了第一个的四个字节,pArr+1就指向了第2个的四个字节,pArr+i就指向了第i+1个的四个字节。pArr[0]就是第一个元素,pArr[i]就是i+1个元素

           2、通过上面的分析,上面的代码*pArr=4(也可以写成a[0]=4),pArr[1]=10(也可以写成a[1]=10),同时在分配了20个字节的系统内存后,使用了free()函数进行了释放内存,这样就不会造成系统内存的浪费

           3、最终结果为:

      

              二、接下来我使用for循环来访问数组,代码如下:

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 int main(void)
     4 {
     5     int a[5] = {4, 10, 2, 8, 6};
     6     int len;
     7     int i=0;
     8     printf("请输入数组的大小:len= ");
     9     scanf("%d",&len);
    10     int * pArr = (int *)malloc(sizeof(int) * len);
    11     for( i=0; i<len;++i)
    12     {
    13         scanf("%d",&pArr[i]);
    14     } 
    15     for(i=0;i<len;++i)
    16     {
    17         printf("%d
    ",*(pArr+i));
    18     }
    19     free(pArr);
    20 
    21     return 0;
    22 }

     运行结果如下:

           

             三、跨函数使用内存例子:

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 struct student
     4 {
     5     int sid;
     6     int age;
     7 };
     8 struct student * creatstudent(void);
     9 void showstudent(struct student *);
    10 int main(void)
    11 {
    12     struct student  *ps ;
    13     ps=creatstudent();
    14     showstudent(ps);
    15     
    16     free(ps);
    17     return 0;
    18 }
    19 void showstudent(struct student *pst)
    20 {
    21     printf("%d %d
    ",pst->sid, pst->age);    
    22 }
    23 struct student * creatstudent(void)
    24 {
    25     struct student * p =(struct student *)malloc(sizeof(struct student));
    26     p->sid=99;
    27     p->age=21;
    28     return p;
    29 }

       运行效果如下:

          

      程序说明:

          这里我们通过建立函数来分配内存单元,来达到内存灵活分配使用。

  • 相关阅读:
    -Prefix.pch has been modified 的错误修复
    Xcode插件,模板安装
    php 内置函数JSON处理
    OC 创建单例
    UITabBarController 的配置
    execute、executeQuery和executeUpdate之间的区别
    iOS类方法实例方法 与 self
    iOS U7ea2 乱码 转换
    PHP 页面跳转的三种方式
    C#数组 动态添加元素
  • 原文地址:https://www.cnblogs.com/1121518wo/p/10887653.html
Copyright © 2011-2022 走看看