首页 > 其他 > 详细

内存管理

时间:2015-12-23 21:22:20      阅读:168      评论:0      收藏:0      [点我收藏+]

动态内存:通常当用户无法确定空间大小,或者空间太大,栈上无法分配时采用。

静态内存:在程序开始运行时有编译器分配的内存,在编译时完成,不占用CPU资源。

两者区别:

  1. 静态内存的分配是在程序开始编译时完成的,不占用CPU资源;而动态内存的分配是在程序运行时完成的,动态内存的分配与释放都是占用CPU资源的。
  2. 静态内存是在栈上分配的;动态内存是在堆上分配的。
  3. 动态内存分配需要指针和引用数据类型的支持,而静态内存不需要。
  4. 静态内存分配是在编译前就已经确定了内存块的大小,属于按计划分配内存;而动态内存的分配是在程序运行过程中,根据需要随时分配的,属于按需分配。
  5. 静态内存的控制权是交给编译器的,而动态内存的控制权是由自己决定的。

  

分配内存

  

  1. malloc()函数

      

    函数原型:

    void *malloc(unsigned int size);

    该函数的功能是分配长度为size字节的内存块。

    如果分配成功,则返回指向被分配内存的指针;否则返回空指针NULL。注意:当内存不再使用时,要使用free()函数释放内存块。

    分配内存大小和返回指针类型都有自己决定。

#include<stdio.h> 

#include<stdlib.h> 

int main() 

{ 

    int* buffer; 

    buffer = (int*)malloc(400); 

    free(buffer); 

    return 0; 

}

  

  

2.calloc()函数

    函数原型:

    void *calloc(unsigned n,unsigned size);

    该函数的功能是在内存的动态区存储中分配n个长度为size的内存块。

    分配结果和malloc()相同,也要用free释放。

#include<stdio.h> 

#include<stdlib.h> 

int main() 

{ 

        int* buffer_m; 

        int* buffer_c; 

        int **buffer; 

        int a[10]; 

        buffer_m = (int *)malloc(20 * sizeof(int)); 

        free(buffer_m); 

        buffer_c = (int *)calloc(20, sizeof(int)); //和malloc效果相同 

        free(buffer_c); 

        return 0; 

}

3.realloc()函数

    函数原型:

    void *realloc(void *mem_address,unsigned int newsize);

    该函数的功能是改变原mem_adress所指向的内存区域的大小为newsize。

    重新分配空间并将原空间内容复制过来,成功返回地址,否则返回NULL。

  

4.memset()函数

    函数原型为:

    void *memset(void *s,char ch,unsigned n);

    该函数功能是设置s中所有的字节为ch,s数组的大小为n。

    注意:是按字节赋值

#include<stdio.h> 

#include<stdlib.h> 

#include<string.h> 

void show(int *a,int n) 

{ 

        int i = 0; 

        for (i = 0; i < n; i++) 

        { 

            printf("%d ", a[i]); 

        } 

        printf("\n----------\n"); 

} 

int main() 

{ 

        int a[10] = { 1,2,3,4,5 }; 

        int i; 

        memset(a, 0, sizeof(a));    //都赋值为0, 

        show(&a,10); 

        memset(a, -1, sizeof(a));    //都赋值为-1, 

        show(&a, 10); 

        memset(a, 1, sizeof(a));    //都赋值为1??? 

        show(&a, 10); 

        return 0; 

}

技术分享

  

  

释放内存

    动态申请内存一定要手动释放该内存空间。free()

    函数原型:

    void free(void *memblock);

 

内存管理

原文:http://www.cnblogs.com/DreamZero/p/5071249.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!