2018-08-10 NDk Day1
ndk 课程第一天
课堂随笔
1、c语言 数据类型与格式化
2、动态内存申请、程序虚拟内存空间、malloc过程与内存碎片
的产生
3、1级指针、解引用与指针运算
Day01:
C 和 c++
C 面向过程的,需要东西需要自己去申请和释放,而且没有类似对象的机制帮助我们进行封装一系列的属性:
C++ 面向对象:
C++是对c的进一步封装.
基本数据类型:
-
Signed
-
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++.
野指针
指向不确定的地址的指针变量。使用野指针容易造成内存泄漏的情况.
访问没有权限的内存,或者访问已经释放了的内存.
- 分配内存.
- 但是分配不一定会成功,因此需要检查是否分配成功.
- 清空内存中的数据,因为Malloc分配的控件可能存在垃圾值,因此需要清理,可以使用memset,或者bzero函数.
- 这个时候才能真正的开始使用内存
- 释放内存(free,这时候的指针ptr又变成野指针了)
6 用完之后保持好习惯,手动只为NULL,防止指针悬空的情况的产生.