C语言基础-- 内存存储

原创 2015年11月17日 19:36:52

存储区划分

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

         对于任何一个内存其实都包括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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

黑马程序员_iOS开发C语言基础之二进制内存存储解析与字符操作

1、内存中变量的二进制存储 #include  int main() {     //  一个int类型数据占据4个字节、32bit     // 0000 0000...

基础数据在内存中的存储-C语言

在计算机中 1、十进制 ---二进制换算 (1)二进制---》十进制  10.101 (二进制转十进制 ) 1*2(1)+0*2(0) + 1*2(-1)+...

C语言变量存储区域 进程内存布局

C程序中,内存通常分为几个大区:共享存储区、栈区、堆区、全局静态区、文字常量区,此外还有程序代码区,其中,全局静态区又可以分为全局非初始化区和全局初始化区,从具体程序中来看,初始化和非初始化的全局OR...

从内存理解c语言中变量的存储类型

今晚看了一下linux程序设计,看到了进程管理这一块,讲解了c语言中的各种变量的存储类型,而且是从进程、内存的角度讲解的,以前从没有这样理解过,觉得挺有用的,在这里记录下来。 首先要来理解一下可...

C语言中float, double类型在内存中的存储方式

本文转载于:http://wenku.baidu.com/link?url=ARfMiXVHCwCZJcqfA1gfeVkMOj9RkLlR9fIexbgs9gDdV8rIS48A1_xe1y6YgX...

windows下变量在内存中的字节存储顺序(c语言)

windows下变量在内存中的字节存储顺序(c语言)

C语言程序的存储区域--内存布局

C语言程序的存储区域   由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-连接三个阶段。编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,连接过程...

从内存理解c语言中变量的存储类型

转载至:http://blog.csdn.net/hackerain/article/details/7953261# 看c专家编程,有说存储类型一直不太清楚。看到一篇文章讲解c...

C语言结构体存储 内存对齐问题

1)内存对齐产生的原因 内存空间是按照字节来划分的,从理论上对内存空间的访问可以从任何地址开始。 但是在实际上不同架构的CPU为了提高访问内存的速度,就规定了对于某些类型的数据 只能从特定的起始...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)