美文网首页
2018-08-10 NDk Day1

2018-08-10 NDk Day1

作者: 小周爱吃瓜 | 来源:发表于2018-08-11 14:11 被阅读15次

    ndk 课程第一天
    课堂随笔
    1、c语言 数据类型与格式化

    2、动态内存申请、程序虚拟内存空间、malloc过程与内存碎片

    的产生

    3、1级指针、解引用与指针运算

    Day01:

    C 和 c++

    C 面向过程的,需要东西需要自己去申请和释放,而且没有类似对象的机制帮助我们进行封装一系列的属性:

    C++ 面向对象:

    C++是对c的进一步封装.

    基本数据类型:

    1. Signed

    2. unSigned

    Int

    unSigned int

    long类型 c中有四个字节

    想要获得一个类型所占有的字节数,使用sizeof表达式.

    Long int = long.

    Unsigned:无符号 比如 0到 65535

    Sign: 有符号 -65535到 65535

    %d 输出所有的整形数据,不同的是不同的数据类型.

    Typedef:

    用sizeof定义size64.

    层次中递归太深的话栈中就会出现StackOverFlow的情况.

    如果c中需要进行在堆中进行动态数据申请的话.

    需要手动的进行内存的申请.

    Malloc()动态申请内存,需要使用free,然后将指针的地址指向0.释放该内存.

    //申请内存并且将内存初始化为null 0

    Calloc(10,sizeof(int)://int 四个字节.

    如何对之前malloc申请的内存空间扩容,用realloc()进行扩容.

    还有个比较特殊的就是alloca(),对于栈当中进行扩容。

    Realloc(i,20*sizeof(int)): 重新对栈中的内容进行扩容.

    Memset:

    Malloc:

    Tcp粘包,分包.

    java是面向对象的,但是c中要使用集合或者对象的话,需要手动的进行空间的申请.

    物理内存:

    通过物理内存条获得的内存空间.

    (多个进程之间的内存都是共享的)

    虚拟内存:

    一种内存的管理技术,能够使用一部分的硬盘空间充当内存使用.

    虚拟内存空间.

    内核空间,栈,内存映射区域,堆.

    由上往下.

    内核空间

     内存映射区域 高地址指向低地址。
    
     堆:
    

    向着低地址进行扩容的,

    由低地址向着高地址进行扩容.

    全局区域,静态区

    代码区

    预留区

    Linux: malloc->> brk,mmap 真正的向系统去申请内存.

    什么时候使用brk?

    Brk: 推内存指针.比如我们申请了10k的内存地址,需要我推10k的内存地址,以便于我们获取更多的内存地址.

    Mmap: 找一块内存满足大小的内存.

    为什么需要memset去申请?

    因为之前用brk申请的时候,这块地址可能是之前的内存碎片,<u>会存在一个内存地址的指向,可能会存在存在脏内存数据</u>.所以要使用memet去重新的申请该内存地址.

    128k 的时候会使用到mmap

    < 128k 的时候回使用到Brk.

    128k 是一个阀值,但是这个阀值是可以进行修改的。

    但是能够进行重用.

    Binder机制 底层就是mmap 映射出一块用户态和内核共享的内存区域.

    什么时候使用mark?

    2018 8/10

    一个c程序会存在 .c /.h 文件.

    .c 源文件

    .h 头文件

    Java 中的申明和实现都是写在一起的.

    但是c的话申明和实现可以是分开的.

    Free:

    引用的传递

    java能够传递import吗?

    List和ArrayList的数据引用可以传递的.

    类似于java的compile.

    C++为什么要把申明和实现分割开?为什么要把这种实现分隔开?

    CMake 类似于java的gradle,都是构建类型的工具.

    今天内容整理:

    ** c中的基本数据类型,java有的,c也有。不同点.**

    C signed(默认的),-x 到x.

    Unsigned:是存在符号的.

    如果想获得一个类型所占字节数,使用sizeof表达式.

    Long long 就是java当中的long long类型.

    java当中的long 就是c当中long long.

    c当中的 short,long都用long表示.

    Unit32 就是一个无符号的无符号的int ,重定义一个别名. 就和unsigned int 是一样的.

    申请一个数组都需要一个数组长度.

    Int a [] = {1,2,3}; 内存是一块连续的内存.

    3*4(字节) 大小的内存地址.

    申请的内存空间默认是在栈当中,但是当我们确定申请内存的大小的时候就可以用malloc,或者brk去申请内存空间的大小. brk原理是推指针,需要多大就推多少上去. 堆中的话就使用malloc去申请一个内存空间大小,用完的时候要用free去释放,并且使用 置为NULL的方式去进行释放,不然i2会成为悬空指针.

    指针,结构体,c++.

    野指针

    指向不确定的地址的指针变量。使用野指针容易造成内存泄漏的情况.
    访问没有权限的内存,或者访问已经释放了的内存.

    1. 分配内存.
    2. 但是分配不一定会成功,因此需要检查是否分配成功.
    3. 清空内存中的数据,因为Malloc分配的控件可能存在垃圾值,因此需要清理,可以使用memset,或者bzero函数.
    4. 这个时候才能真正的开始使用内存
    5. 释放内存(free,这时候的指针ptr又变成野指针了)
      6 用完之后保持好习惯,手动只为NULL,防止指针悬空的情况的产生.

    相关文章

      网友评论

          本文标题:2018-08-10 NDk Day1

          本文链接:https://www.haomeiwen.com/subject/wwhbvftx.html