1.内存的划分  (从高到低依次是: 栈区 堆区全局静态区 、 常量区代码区 )栈区是系统自动回收,堆区是我们手动回收

 2栈区   在函数内部定义的局部变量和数组、都存放在栈区,栈区的内存空间是由系统管理,函数调用的时候开辟空间,函数调用结束,空间就被回收

 3.堆区   由我们手动来(管理)开辟,手动回收

 4.全局静态区   存放全局变量和静态变量。空间是由系统管理。(函数外部定义的变量,在定义的时候,这个空间就已经被开辟了)程序开始执行时开辟空间,程序结束执行时回收空间,程序执行期间一直存在。

  1. for (int i = ; i < ; i++) {
  2. static int a = ; //static 修饰的变量仅被初始化一次
  3. printf("%d",a++);
  4. }
  5. static 修饰的变量只初始化一次

对于static修饰的变量 有三个特点:

(1)仅仅初始化一次

(2)如果没有给初始值的话,那就默认给为 0

(3)生命周期:一旦给定一个 static 变量,他的生命周期就是在程序的整个运行期间

 5.常量区  存放常量。整型常量,字符型常量,浮点常量,字符串常量。 在整个的程序运行期间不能被改变。 空间是由系统管理的,生命周期,在程序运行期间一直存在(与程序的生命周期一样)

 6.代码区  存放程序执行的CPU指令,我们的代码最后在编译的时候都会转化为相应的CPU指令,告诉计算机如何执行程序

  1. // char *string ="iphone";//栈区
  2. // string[0] = 'a';//程序将崩溃 因为常量区不能被修改 会直接crash

malloc(size_t)函数 在堆区开辟 size 个字节的空间,并把首地址返回

malloc 和 alloc 函数区别 参考

define 与 const 的区别  参考

  1. char *p = malloc();//堆区开辟10个字节的空间
  2. strcpy(p, "iphone");//在对应的空间赋值一个“iphone”字符串
  3. printf("%c\n",*(p+));
  4. printf("%s\n",p+);//从第二个字母开始后面的字符串
  5. printf("%s\n",p);//根据字符串的首地址去打印字符串
  6. printf("%p\n",p+);//找第二个字母的位置
  7. free(p);//根据p的首地址,手动去释放我们自己建立使用的堆空间,只是标记删除,不清除内容
  8. printf("%s\n",p);
  9. p = NULL;//洗碗,下次我们再使用的时候,更加的准确,安全

malloc 函数的使用 与 释放

  1. char *p = malloc();//堆区开辟10个字节的空间
  2. strcpy(p, "iphone");//在对应的空间赋值一个“iphone”字符串
  3. printf("%c\n",*(p+));
  4. printf("%s\n",p+);//从第二个字母开始后面的字符串
  5. printf("%s\n",p);//根据字符串的首地址去打印字符串
  6. printf("%p\n",p+);//找第二个字母的位置
  7. free(p);//根据p的首地址,手动去释放我们自己建立使用的堆空间(p指向是空间),只是标记删除(只是释放掉了空间),p的内容不清除内容,在内存里
  8. //free(p)就是开房之后,要退房了,p = NULL;就是交还房间的钥匙。malloc初始化的时候,就是开房的例子,如果没有 p = NULL;将会有野指针问题
  9. // malloc 与 free 只能成对出现,free 如果过度释放,就会造成程序立即crash(崩溃)
  10. printf("%s\n",p);
  11. strcpy(p, "哦哦哦");
  12. printf("%s\n",p);
  13. p = NULL;//洗碗,下次我们再使用的时候,更加的准确,安全
  14. printf("%s\n",p);

free 的注意问题

其他内存分配函数

calloc函数 :       calloc(n 个size大小的空间, size);分配n 个size 大小的内存空间,比 malloc(<#size_t#>)多了一功能:清零的操作,但是效率低 ,不常用

realloc函数         作用是在,realloc(起始地址, newSize)  内存从新分配函数 按照给定的 newSize 大小重新分配空间

内存的操作函数:  memset(给定的开始地址, n, size);    给定的地址作为开始的地址,从这个地址开始将 size 字节的数据初始为 n,  size 的单位是 字节

memcpy(拷贝目的地址的指针, 源地址, size);  将源地址的数据里 size 个大小 拷贝到 目的地址指向的内存中

memcmp(目的地址, 源地址, size );内存比较函数  就是为给定的 目的地址 源地址 开始的内存里 取 size 个数据相比较大小,返回类型为 int

  1. int * p11 = malloc(sizeof(int) * );
  2. *(p11 + ) = ;
  3. *(p11 + ) = ;
  4. *(p11 + ) = ;
  5. int * p12 = alloca(sizeof(int) * );
  6. *(p12 + ) = ;
  7. *(p12 + ) = ;
  8. *(p12 + ) = ;
  9. memset(p11, , );
  10. for (int i = ; i < ; i++) {
  11. *(p11 + i) = arc4random() %( - + ) + ;
  12. printf("%d ",*(p11 + i));
  13. }
  14. printf("\n");
  15. for (int i = ; i < ; i++) {
  16. printf("%d ",*(p12 + i));
  17. }
  18. printf("\n");
  19. int v = memcmp(p11, p12, sizeof(int) * );
  20. if (v == ) {
  21. printf("YES \n");
  22. }else{
  23. printf("NO \n");
  24. }
  25. free(p11);//这里不用再释放 p12 了,因为在上面已经释放了 calloc有清零功能
  26. p11 = NULL;

内存稻作函数的使用 demo

堆区一定要注意的三个问题: 野指针 、内存泄露 、 过度释放

malloc一定要和 free 配对使用

const  是C的关键字。const 修饰的变量就相当于是个常量,在程序运行期间不能再被修改。

常量与变量的区别::常量在运行期间不可以被改变,变量在程序的运行期间是可以被改变的,一旦被 const 修饰的变量 他就变成了一个不可以被修改的常量,相当于常量来使用

  1. int a1 = , b1 = ;
  2. // const int *p1 = &a1; *p1 是不可以被改变的
  3.  
  4. // int * const p1 = &a1; //p1 是不可以被改变的
  5. const int * const p1 = &a1; // p1 与 *p1 的值都不能被改变

static 与 const 的区别:

  1. const 作用:做安全处理
  2. const
  3. .C 语言提供的一个关键字,被他修饰的变量具有不可变性
  4. .便于进行类型检测,使编译对处理内容更多的了解,消除了一些隐患
  5. .可以避免模糊的数字出现。同时可以方便的进行参数的调整和修改
  6. .可以保护被修饰的东西,防止意外修改,增强程序的健壮性
  7. .可以节省空间,避免不必要的内存分配
  8. .提高效率------编译器通常不为const 常量分配存储空间,而是将他们保存在符号表中,这使得他们成为编译期间的一个常量,没有了存储与读内存的操作,使得效率更高

void *   是泛型  可以代表所有的指针类型。如 int * 、 char * 、……

内存分配参考

C:内存分配、内存中五大区的更多相关文章

  1. JVM常用参数(内存分配 内存回收日志)

    内存监控  -verbose:gc 测试代码 public static void main(String[] args){ List<Classes> classes=new Array ...

  2. Netty源码—五、内存分配概述

    Netty中的内存管理应该是借鉴了FreeBSD内存管理的思想--jemalloc.Netty内存分配过程中总体遵循以下规则: 优先从缓存中分配 如果缓存中没有的话,从内存池看看有没有剩余可用的 如果 ...

  3. Netty 中的内存分配浅析-数据容器

    本篇接续前一篇继续讲 Netty 中的内存分配.上一篇 先简单做一下回顾: Netty 为了更高效的管理内存,自己实现了一套内存管理的逻辑,借鉴 jemalloc 的思想实现了一套池化内存管理的思路: ...

  4. 深入理解golang:内存分配原理

    一.Linux系统内存 在说明golang内存分配之前,先了解下Linux系统内存相关的基础知识,有助于理解golang内存分配原理. 1.1 虚拟内存技术 在早期内存管理中,如果程序太大,超过了空闲 ...

  5. 【转载】C++内存分配

    原文:C++内存分配 内存泄露相信对C++程序员来说都不陌生.解决内存泄露的方案多种多样,大部分方案以追踪检测为主,这种方法实现起来容易,使用方便,也比较安全. 首先我们要确定这个模块的主要功能: 能 ...

  6. [转]使用Java Mission Control进行内存分配分析

    jdk7u40自带了一个非常好用的工具,就是Java Mission Control.JRockit Misson Control用户应该会对mission control的很多功能十分熟悉,JRoc ...

  7. 内存分配(c/c++)

    C++中内存分配          内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 1,栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的 ...

  8. C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配

    特殊的工具和技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自己主动执行合适的构造函数来初始化每一个动态 ...

  9. Java内存分配以及GC

    转自http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html  写的太棒了,简单易懂 Java垃圾回收概况 Java GC(Gar ...

随机推荐

  1. Error accessing PRODUCT_USER_PROFILE

    1.问题现象再现1)创建用户secSQL> create user sec identified by sec; User created. 2)授权SQL> grant connect, ...

  2. Notify通知

    1.NotificationManager类对象         <1>getSystemService(Context.NOTIFICATION_SERVICE) 获取通知管理对象   ...

  3. 如何定义 Java 中的方法

    所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.p ...

  4. Linux makefile教程之总述二[转]

    Makefile 总述——————— 一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个或 ...

  5. vmware 连网

    Nat 这 种方式下,虚拟机的网卡连接到宿主的 VMnet8 上.此时系统的 VMWare NAT Service 服务就充当了路由器的作用,负责将虚拟机发到 VMnet8 的包进行地址转换之后发到实 ...

  6. 解决 winform 界面对不齐 z

    一个winform的程序,本机上界面对得很齐,到一到客户的机器上就惨不忍睹,一番研究后搞定: 1. AutoScaleMode = None 2. BackgroundImageLayout = No ...

  7. HTTP长连接(Comet)实现方式示例

    昨天看了comet的介绍后,虽然大概知道了comet的原理,不过没实际用过还是不太清楚,于是今天又在网上翻了一下别的网友共享的comet实现http长连接的例子,在 Comet Server Push ...

  8. selenium python (十三)对于分页的处理

    #!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #对于web上分页的功能,一般做如下操作:    #获取总页数    # ...

  9. saltstack配置安装的一些关键步骤及安装时各种报错的分析

    以下其他仅做参考,官方网址才是安装重点:http://docs.saltstack.cn/topics/installation/rhel.html 与安装相关的一些文档或资料: 一.linux服务器 ...

  10. JS方式调用本地的可执行文件

    看到一个方法,有些用,先存下来,有用的时候再用. 前几天,在IE,FIREFOX中实现了用JS方式调用本地的可执行文件.地址:www.yihaomen.com/article/js/211.htm , ...