关闭

C语言基础-- 内存存储

标签: c语言存储内存栈区堆区
109人阅读 评论(0) 收藏 举报
分类:

存储区划分

-----------------------------------------

         对于任何一个内存其实都包括5个区域
      五个区:(内存地址从高到低依次为)
       1、栈区
              特点:由系统分配以及回收内存。 定义在函数体内分配的变量被分配在栈区
       2、堆区(重点)
             特点:由用户(开发人员或程序猿)申请分配和回收。 malloc
                 假如你一致开辟内存而不去回收,会导致系统内存越用越少,最终导致程序crash(崩溃)。
                  假如你一直没有回收,而且也没有崩溃,当你程序退出的时候,系统帮你回收
      3、静态区(全局区)
            特点:定义在函数体外的变量或者有static关键字修饰的变量
             程序运行过程中一直存在,直到程序退出时候由程序回收
      4、常量区
            特点:用来存放常量的内存区域: 例如12,64,567 占用
      5、代码区

     特点:把原代码转化成0101的二进制序列存放在代码区 编程CPU指令存放在代码区,函数名也在

--------------------------------------------------------------

     例1:
         int a = 8;
           for (int i = 0; i < 9; i++) {
         }
         printf("i = %d\n",i);

         出了函数作用域就会被回收


常量区: 占用内存是只读状态的,不能被修改

          //static所修饰的变量特点:1、只初始化一次 2、只有程序退出才释放 3没初始化值,默认为0 4、该变量存在内      存的静态区


--------------------------------------------------------------

堆内存分配函数

 malloc void *malloc(unsigned int size);

             malloc是函数的名字, malloc函数向系统申请分配四则个连续的内存空间(以字节为单位)

             函数返回值是void * 是一个指针类型,但不代表确切的指针类型,程序员根据自己的需求转化为所需要的类型


             void *p = malloc(10);                                //p指向的是堆内存的里边的一个地址
                int a = 8;                                                //a分配的在栈内存
              指针p里边存储的是10个字节的内存的首地址

           

              malloc 堆内存分配函数特点: 分配指定大小的内存空间,但是不会把分配到的内存空间给清0


内存释放:free

           void free(void *)
           free函数的作用是释放内存,内存释放是标记删除。标记删除不清除里边的内容。

           

            例子:加入一部电影占了2G内存,正常理解删除的电影的话,是应该吧这部定影就清楚了,也就是说,对应         的内存空间里边的字节全部清除。但是这是一个非常庞大的工作量需要很长那个时间来完成。但实际生活中删除          一部电影几乎1秒就完成了,其实也就是标记删除,告诉系统这2G内存空间不用,谁想用分配给谁。

其他的分配函数:
            calloc(unsigned m, unsigned n)
            跟malloc不一样的地方在于,通过calloc分配的内存空间上的所有字节都会被清0


            realloc(<#void *#>p, unsigned newsize) 按新的长度重新赋值

其他内存操作函数

         void *memset (void *s, int c ,size_t n)

            s是指针的首地址,从s指向的内存地址开始分配,分配n个字节大小的数据c

            通常用于清除结构体或者数组中的数据


       memcpy(<#void *#>dest, <#const void *#>source, <#size_t#> n) 内存的拷贝
             从source指向的位置开始拷贝,拷贝到的dest里边去,长度为n;

         free(p3);


内存比较:

         memcmp p1、p2是两个指针,比较p1和p2内存地址里边的值的ASCII值,结果可为<0 >0 =0

               memcmp(const void *p1, <#const void *#>p2, sizeof(p1))


----------------------------------------------------------------------------------------------

        堆内存专属函数:malloc calloc realloc

         内存操作函数,既可以用于堆内存,也可以用于栈函数 memcpy memcmp memset

----------------------------------------------------------------------------------------------

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3504次
    • 积分:165
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条