2018-08-10 NDk Day1

2018-08-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,防止指针悬空的情况的产生.
上一篇下一篇

猜你喜欢

热点阅读