c/c++动态分配内存和malloc的使用

c/c++动态分配内存 

 

为什么需要动态分配内存

---很好的解决的了传统数组的4个缺陷

 

动态内存分配举例

---动态数组的构造

 

使用动态数组的优点:   
1. 动态数组长度不需要事先给定;
2. 内存空间可以手动释放;
3. 在程序运行中, 动态内存空间大小可以通过realloc函数手动扩充或缩小
   

 静态内存和动态内存的比较  


  静态内存是由系统自动分配,有系统自动释放

  静态内存是在栈分配的

  动态内存是由程序员手动分配,手动释放,动态内存是在堆分配的

 

动态内存和静态内存的比较

静态内存是由系统自动分配,由系统自动释放
静态内存是在栈分配的

动态内存是由程序员手动分配,手动释放
动态内存是在堆分配的

 

难点

 

/*
    2009年11月17日10:21:31
    malloc 是 memory(内存) allocate(分配)的缩写

*/
# include <stdio.h>
# include <malloc.h>  //不能省

int main(void)
{
    int i = 5; //分配了4个字节 静态分配   11 行
    int * p = (int *)malloc(4); //12行
        /*
            1. 要使用malloc函数,必须添加malloc.h这个头文件
            2. malloc函数只有一个形参,并且形参是整型
            3. 4表示请求系统为本程序分配4个字节
            4. malloc函数只能返回第一个字节的地址
            5. 12行分配了8个字节, p变量占4个字节, p所指向的内存也占4个字节
            6. p本身所占的内存是静态分配的, p所指向的内存是动态分配的       
        */

    *p = 5; //*p 代表的就是一个int变量, 只不过*p这个整型变量的内存分配方式和11行的i变量的分配方式不同
    free(p); //freep(p)表示把p所指向的内存给释放掉  p本身的内存是静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数运行终止时由系统自动释放 
    printf("同志们好!\n");

    return 0;
}

 

 

malloc的用法:
demo1 .
# include <stdio.h>
# include <malloc.h>

void f(int * q)
{
    //*p = 200; //error
    //q = 200;
    //**q = 200;  //error
    *q = 200;
    //free(q);  //把q所指向的内存释放掉  本语句必须的注释掉,否则会导致第20行的代码出错
}

int main(void)
{
    int * p = (int *)malloc(sizeof(int)); //sizeof(int)返回值是int所占的字节数
    *p = 10;

    printf("%d\n", *p);  //10
    f(p);  //p是int *类型
    printf("%d\n", *p);  //200    第20行

    return 0;
}

 

demo2.

# include <stdio.h>
# include <malloc.h>

int main(void)
{
//    int k;
    int * p = (int *)malloc(4);  
        /*
            malloc函数的返回值是void *
            void * 也叫干地址  所谓干地址就是无实际意义的地址
        */

    free(p); //把p指向的内存释放

    return 0;
}

 

 

动态一维数组示例:

# include <stdio.h>
# include <malloc.h>

int main(void)
{
    int a[5]; //如果int占4个字节的话,则本数组总共包含有20个字节,每四个字节被当做了一个int变量来使用
    int len;
    int * pArr;
    int i;

    //动态的构造一维数组
    printf("请输入你要存放的元素的个数: ");
    scanf("%d", &len);
    pArr = (int *)malloc(4 * len);  //第12行  本行动态的构造了一个一维数组, 该一维数组的产度是len, 该数组的数组名是pArr, 该数组的每个元素是int类型  类似于 int pArr[len];
    
    //对一维数组进行操作,  如:对动态一维数组进行赋值
    for (i=0; i<len; ++i)
        scanf("%d", &pArr[i]);

    //对位一维数组进行输出
    printf("一维数组的内容是:\n");
    for (i=0; i<len; ++i)
        printf("%d\n", pArr[i]);
    
    free(pArr); //释放掉动态分配的数组
    

    return 0;
}

 

示意图:

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2014-06-28 10:51  mjorcen  阅读(1103)  评论(0编辑  收藏  举报