专题:动态内存分配----基础概念篇

传统数组的缺点:

  1. 数组长度必须是事先定义的,而且必须是常整型,不能是变量。

    例:

      int a[5]; //ok

      int len=5; int a[len]; //error

  2. 传统形式定义的数组,该数组的内存空间程序员无法手动释放

    在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行结束,数组的空间

    才会被系统自动释放。

  3. 数组的长度一旦定义,期长度就不能更改

    数组的长度不能再函数运行的过程中动态的扩充或缩小

  4. A函数定义的数组,在A函数运行期间可以被其他函数使用,但A函数运行结束后,A函数中的数组就不能被其他函数使用。

    传统定义的数组不能跨函数使用。

 

 

/****************************************************

 malloc函数的介绍和使用

 malloc:是memory(内存)和allocate(分配)两个单词缩写的。

 ***************************************************/

#include <stdio.h>

#include <malloc.h>

int main(void)

{  

  int i=5;  

  int * p=(int *)malloc(4);/*         Malloc向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。

                    1. 要使用malloc函数必须要声明头文件malloc.h      

                      2. malloc函数只有一个形参,并且形参是整型。        

                    3. 4表示内存分配动态存储空间4个字节。        

                    4. 这行总共占8个字节,系统本身为以p的内容为地址的变量分配了静态的4个字节+p指向的动态内存空间4个字节。        

                    5. malloc只能返回第一个字节的地址        

                    6. p本身所占的内存是静态分配的,p所指向的内存是动态分配的。        

                    7. int * 表示强制转换malloc函数所返回的第一个字节地址的内容的类型。        

                   */  

  *p=5;  //*p代表的就是int类型,只不过和i的分配方式不一样。  

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

  free(p);//释放动态内存空间,由程序员来完成的。 

  return 0;

}

 动态一维数组的输入和输出例子:

  1 #include<stdio.h>

  2 #include<malloc.h>
  3 void malloc_1(int *);
  4 int main(void)
  5 {
  6     int a[5]={1,2,3,4,5};//20 byte
  7     int len;
  8     printf("please input len: ");
  9     scanf("%d",&len);
 10     int * pArr;
 11     pArr=(int *)malloc(4*len);//len==5,20 byte
 12     //*pArr=99;
 13     printf("please input 5 numbers: ");
 14     for(int i=0;i<len;i++)
 15         //scanf("%d",&pArr[i]);
 16         scanf("%d",pArr+i);
 17     *pArr=99;
 18     printf("output is: \n");
 19     for(int i=0;i<len;i++)
 20     {
 21         malloc_1(pArr);
 22         printf("pArr[%d]=%d\n",i,pArr[i]);
 23     }
 24     //malloc_1(pArr);  
 25         // printf("pArr[%d]=%d\n",i,pArr[i]);
 26     free(pArr);
 27     return 0;
 28
 29 }
 30 void malloc_1(int *q)
 31 {
 32     *q=100;
 33 }

posted @ 2016-10-25 17:03  feng_kui  阅读(143)  评论(0编辑  收藏  举报