当前课程知识点:C/C++:从基础语法到优化策略 >  Final Exam >  Final exam >  5.2 Allocate memory: C style

返回《C/C++:从基础语法到优化策略》慕课在线视频课程列表

5.2 Allocate memory: C style在线视频

返回《C/C++:从基础语法到优化策略》慕课在线视频列表

5.2 Allocate memory: C style课程教案、知识点、字幕

大家好 前面我们讲完了指针 我们再来讲现在的第二部分申请内存

就是用C语言的函数来去申请

这部分是比较刺激的 比较小心的

前面我们已经提到指针是去操作内存的

那么这个内存要操作呢

我们前面就说把一个变量取一个地址 然后再赋给指针 那么你能操作只是一个变量

那么如果我们要操作一段内存 一块比较大的数据 那么怎么去做

那么在这我们来给大家介绍一下

首先 去申请内存的这个函数叫malloc

他只有一个参数size 他的类型是size_t size_t是什么呢

那么size_t实际上它就是整数 它是一个无符号的整数来描述大小的

那么他跟int有什么区别 跟long有什么区别呢

其实他就是用int或者long定义的

他用来去描述大小 一般来说sizeof返回的类型就是size_t

size_t 他用来干什么 他用来描述我们的一个理论上最大的对象或者元素

就是你去遍历的时候 那么它最大是多大

那么就存这个

那么这这个元素可以是我们的c++的对象 也可以是结构的对象

也可以是一些 比如说字节

那么我们可以用size_t 也就是说它是来描述大小的

所以说在目前我们的pc系统里面 一般来说它现在都是64位的无符号整数

但有的32位的系统里面 它可能是32位的无符号整数

那么这是它的最大值

所以说如果是32位的系统 然后size_t是32位

那么你能够一次性申请的内存最大就是4GB 2的32次方

那么这个函数 它的作用是什么

这个函数就是去申请一块内存

申请这块内存 用来给你用去放数据

内存多大呢 就是size

单位是什么 他的单位是字节byte

那么申请了这么多个byte 然后你可以把它转成某种类型的指针看你的需要

你可以转成char类型的指针 你可以转成int类型的指针 你可以转成其他任意的

然后指针你可以做一个显示的一个强制类型转换

因为它的返回是void型 可以转任意的类型

那么这是相当于非常原始的从内存里面拿一块数据直接去用

那记住就这首先强调一下

你如果用malloc申请的内存 一定记得在用完之后去free去释放掉

那么就是把你前面的malloc返回的那个值 那个指针传给free

然后执行一下 这块内存就会被返还

然后这个应用程序就不能再应用它了

那返还之后 那么可能会分配给

你下一次malloc的时候他又重新分配了又会重用的

记住就说如果你不这样做会怎么样

你只去malloc不去free 那么你可以做个实验试一下

你每次申请100M内存 你循环个很多次

那他就会把你的计算机的内存全部耗光

耗光之后那程序可能会失去响应

有的操作系统可能会直接杀死这个应用程序 等等

那就会引起系列的问题 就是说一定记得去free 他们两个要成对出现你申请了就要释放

还有大家注意一下你释放之后这个指针 你释放之后他并不会被置0

并不会置0 它的这个指针的地址他不会做任何的改变

那么我们来看一个例子malloc

我们来看 这个例子我来讲一下

第一我们一上来 我们先调用malloc函数

申请了多少个字节呢

因为我先看我们的申请完的内存 我会赋给p1

p1是int类型的指针 那么我想申请4个int

我要创建一个数组 有四个int类型的元素

那么我需要多少个字节呢

首先是4个整数 每个整数sizeof(int)

但有的同学说我这能不能写个4呢 不要用sizeof

理论上可以 但是那样做不安全

因为不是所有的系统sizeof(int)都是4

如果他万一不是4那你可能就会出问题

所以说在这儿的话 建议用sizeof来算你需要多少个字节

你4个整数sizeof乘上sizeof(int)的返回值

那就是你需要的这个内存的字节数

在这里比如说在我的这个pc系统里面

那么他是一个4乘以4就是16

然后申请了内存之后就把这个内存的地址

强制转化成int类型的指针 然后赋给p1这是他的操作

第二个操作double类型跟前面int类似

唯一不同的是我也是申请四个double元素

然后这个地方 那么应该是8

4乘以8他就会申请32个字节转成double指针赋给p2

那么我们再去 既然我们有了p1p2两个数组

每个数组里面都有都是int元素

那我们就不妨做一下这个地方有个小的这个不是很完美的地方 我重新改一下

if p1 如果你负值之后p1不是NULL不是0那说明他成功的拿到了内存

这要做检查有的时候申请内存会失败

如果成功申请到内存 我就循环4次

把p1[n]里面元素变成n的平方赋进去

然后 这没错是我看错了眼花了

那回来 然后我去把这4个值给打印出来

好这是对p1对p2同样的 它是个double类型

那么我p2[n]也是n的平方

然后也去循环一下 把它打印出来

这个地方printf是c语言的打印

我们没有用cout在这我们全是c语言的函数

printf %d就是在这个地方打印一个整数

那索引也是整数 那就是n

那就是他会用n的值去替换第一个%d用p1[n]这个数组里面的值

去替换第二个%d那么在第二个里面 既然它是一个浮点类型 我们%f去打印

那么索引数也是一样的 也是用%d把这个索引打印出来

那么这样的话 我们就可以打印完之后我们再去free

把这两个记住 一定要释放掉

好 我来编译一下

我们来看 那么

这个程序非常顺利的运行了

p1这个数组里面 它的元素分别是0 1 4 9 n的平方

double类型是一样的 0 1 4 9 这样出来了

我们还可以刚才我提到free之后它的指针这个地址并不会被赋0

我们如果现在打印一下p1和p2的地址实际上他去malloc返回的那个地址

那么free之后 它的地址

p1的值他这个地址还变不变呢

我们可以把它打印出来看一看 在free之前 free之后都去打印一下

那么在这打印的 我用了llx

因为在我这个系统里面 他p1是个指针 它是一个长整型的

long long类型的 所以我用long long x x是16进制打印

好 我们把它编译一下

这个地方 他有个警告 他说我把这个p1然后强制转成了unsigned long long

好我们先不管他

这运行一下

我们来看p1这个地址 p2这个地址 在释放前释放后

他们这个地址还是没有变

p1的值没有变p2的值也没有变

那意味着什么呢 如果这个时候我释放完之后

我继续去做一些操作 比如说p1[0]或者2也行 等于45

这样去做会怎么样

那么也就是说你刚才的内存里面已经被释放了 交还了 但是你依然去用它去写它

那么你去写了之后没人知道 那么下一次这块数据又被人

又被程序申请去做别的用途 然后你这样去一写 就相当于把别人的数据给改了

所以说这个地方是很容易引起bug的

如果p1p2这个指针你后面还想继续用这个变量的话

我的习惯性的做法是直接p1=0 p2=0 直接把它这样初始化一下

你再去做操作 那就会引起段错误

这是我的一个个人的习惯

当然我们讲的是C语言的内存的申请和释放

那么C++其实是类似的

那么最后我们再用一个示意图来展示一下

我们刚才的这个操作malloc申请内存操作他在做什么

那么我们来看一看我们有有三行代码

第一行代码 我们来看int* ptr=0

他做了什么 当程序运行到这一步的时候

首先他给ptr变量申请一块空间

可能是四个字节 也可能是八个字节 在这个例子里面 我们有四个字节

那申请这四个字节给ptr就用来存地址

那目前的这个地址是零我就初始化成零这个地址

第二步就是我们去用malloc(16)

16个字节去申请16个字节转成int类型的指针赋给ptr这件事情

首先申请内存是这样的

直接从内存内存里申请16个字节123456从0一直到15就是索引

16个字节被申请到

申请到之后函数malloc函数返回一个地址 也就是零地址

首字节的地址 这个地址就会传给就是这个赋值操作传给ptr

那么这个地址就会填到ptr他的本身的值里面去

比如说我随便写了一个地址叫A0 CD EF 89

这么一个地址

这个地址就是这个内存的地址

那么赋给他 那么ptr这个指针的值就是我们malloc返回的内存的地址

在这之后假如我们要去操作这里面的内容

比如说这样 ptr[2] 等于

这个地方是一个16进制的整数 这个不是一个地址

这只是一个普通的整数 我只是把它写成16进制

你可以写成十进制 你可以写成八进制 任意的进制都是没问题的

那么这样一个16进制的整数去赋值的时候赋给谁呢

ptr这个指针里面的索引为2的元素

这里面记住 索引为2的元素不是这一个

因为ptr是一个int类型的指针 他是第0 1 2个整数

那么第零个整数是0 1 2 3字节

编号为1的整数就是4 5 6 7这个字节

那么2这个整数就是8 9 10 11这四个字节

这四个字节才是ptr[2]指向的

那么就把这个赋进去 那他值就是这个样子的

这16进制第一位0D放到第一位去0C放到第二位

0B放到第三 0A就放到最高位上去

这样赋值操作就完成了

这个就是我们说的这个指针的操作是什么

就是指针去怎么去做这些事情

看了这个示意图 我相信你可能会理解一些

C/C++:从基础语法到优化策略课程列表:

Week 1 Quick start

-1.1 Basic knowledges

-1.2 Setting Out to C++

-Lecture notes

-Example code

-Quiz 1

Week 2 Data types

-2.1 Compile and link

-2.2 Integers

-2.3 Floating-point numbers

-2.4 C++ Arithmetic Operators

-Lecture notes

-Example code

-Quiz 2

Week 3 Expressions and statements

-3.1 Some operators

-3.2 for loop

-3.3 Relational expressions (> < ==)

-3.4 while loop

-3.5 Branching statements (if else)

-3.6 Logical expressions

-3.7 switch statement

-3.8 break and continue statements

-3.9 File input and output

-Lecture notes

-Example code

-Quiz 3

Week 4 Array, string and structures

-4.1 Array

-4.2 Array strings

-4.3 string class strings

-4.4 Structures, Unions and Enumerations

-Lecture notes

-Example code

-Quiz 4

Week 5 Pointers and memory management

-5.1 Pointers

-5.2 Allocate memory: C style

-5.3 Allocate memory: C++ style

-5.4 Managing memory for data

-Lecture notes

-Example code

-Quiz 5

Week 6 Functions

-6.1 Function review

-6.2 Various functions

-6.3 Recursion and pointer to functions

-6.4 Reference and const

-Lecture notes

-Example code

-Quiz 6

Week 7 Functions and optimization

-7.1 Adventures in functions

-7.2 Speedup your program

-Lecture notes

-Example code

-Quiz 7

Week 8 ARM and OpenCV

-8.1 C/C++ with ARM development board

-8.2 Some tricks in OpenCV

-Lecture notes

-Example code

-Quiz 8

Week 9 Class

-9.1 Classes in C++

-9.2 Constructors and destructors

-9.3 this pointer

-Lecture notes

-Example code

-Quiz 9

Week 10 Operator overloading and type casts

-10.1 Operators in cv::Mat in OpenCV

-10.2 Operator overloading

-10.3 Friend functions

-10.4 Automatic conversions and type casts for classes

-Lecture notes

-Example code

-Quiz 10

Week 11 Dynamic memory management and classes

-11.1 Dynamic memory and classes

-11.2 New and improved String class

-11.3 Using pointers to objects

-Lecture notes

-Example code

-Quiz 11

Week 12 Class inheritance and memory management

-12.1 Class inheritance

-12.2 Static and dynamic binding

-12.3 Access control: protected

-12.4 Inheritance and dynamic memory allocation

-Lecture notes

-Example code

-Quiz 12

Week 13 Constructor, assignment and class templates

-13.1 Constructor and assignment

-13.2 Classes with object members

-13.3 Private inheritance

-13.4 Class templates

-Lecture notes

-Example code

-Quiz 13

Week 14 CNN, exceptions in C++

-14.1 CNN for image classification

-14.2 Exceptions

-Lecture notes

-Example code

-Quiz 14

Week 15 Friends, nested classes, RTTI and type cast

-15.1 Friends

-15.2 Nested classes

-15.3 RTTI and type cast operators

-Lecture notes

-Example code

-Quiz 15

Final Exam

-Final exam

5.2 Allocate memory: C style笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。