CS50 2016-Week4 学习笔记

124 篇文章 1 订阅

这节课讲内存(Memory),听了半节课,云里雾里的。
直到听到关键词:地址、指针。

C语言程序设计 中有有好几章讲指针。比视频中更容易理解一些。

以下内容摘抄自 C语言程序设计 第9章:


  1. 根据冯诺依曼提出的“存储原理”的计算机工作原理,程序要装入内存后才能进行处理,数据也要装入内存才能进行处理。
  2. 内存是以字节为单位的一片连续存储空间,每个字节都有唯一的编号,这个编号称为内存的“地址”。
  3. 如同人们通过房间号来管理旅馆一样,系统通过内存地址来对内存进行管理。
  4. 地址从0开始,顺序依次编号,且地址用二进制表示。(下面用十进制来表述)
  5. 编译系统根据变量的类型,为其分配一定字节的存储单元。如int i;, 系统为变量i 分配4个字节的存储单元。
  6. 假定系统为变量i分配的4个字节(1201~1204)如下图所示,那么变量 i 的内存地址就是1201(第一个字节的地址)。
  7. 一般情况下,程序员无需知道每个变量在内存中的具体地址,生成二进制目标程序时,编译系统将变量名转换成了相应的内存地址。所以,程序通过变量名对变量的访问,实际上是对某个地址存储单元的访问。(这种直接按内存地址访问变量的方式称为直接访问)

这里写图片描述


下面的图更清楚些,定义一个变量时,系统会在内存中为变量分配一块空间。
例如上面为int i;变量i分配4个字节(1201~1204)的空间。i = 30;,将30(实际是二进制数)写在这块空间里。
访问变量i时,就是访问变量i指向的内存地址存储空间中的30

这里写图片描述


如果是课堂上,指针够老师讲两个星期的。

上面是按照内存地址直接访问变量。

C语言还提供了一种间接访问。即将要访问的变量的地址存在一个指针变量中。,访问时先从指针变量中取出地址值,然后根据地址值去访问对应的存储单元。看下面几行代码

int i; 定义变量i,编译时,系统为变量 i 分配4个字节的存储空间。
int *p; 定义指针变量p,系统为变量 p 分配4个字节的存储空间。
i = 30; 将30(0000…11110)写到变量 i 对应的存储空间里。
p = &i 使用&取地址符将变量i对应的内存地址写到变量 p 对应的存储空间里。

如下图,假设变量i(4个字节)的内存地址为1201,变量p(4个字节)的内存地址为2300
变量i 中存储着一个整数30,指针变量p中存储着变量i的内存地址1201

间接访问时,要先访问指针变量,按照指针变量 存储的地址值去访问相应的存储单元。这样比起直接访问,要费时间,且不直观。但是,通过改变指针变量的值,即改变其指向,可访问不同的变量,更加灵活,也使代码更简洁和有效。

这里写图片描述


视频中还有几个重要的概念。

首先,memory leak(内存泄漏)。

比如int x = malloc(40),请求系统为x分配40字节的存储空间。
(malloc,memory allocate)

如果这条语句在一个普通函数中,不停地被调用,即不停请求分配40字节的存储空间。
系统内存会一直被占用,内存越来越少,即 内存泄漏

解决办法是,每次请求分配存储空间后,使用free()释放内存。


然后,stack overflow(堆栈溢出)(著名网站)。

看下面的例子:

程序中请求为name变量分配9个字节的内存空间,即能存储9个字符。
实际上输入了FengWeilei10个字符,将FengWeilei写入name时,自然不够写。然后会被写入内存中其他的地方,很容易造成大麻烦。

这里写图片描述

和stack overflow 类似的,还有heap overflow,buffer overflow。


最后,hexadecimal,十六进制数(0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f)。

视频中提到,Jpg文件前三个字节都是255,216,255。

255(1111 1111,0xff)
216(1101 1000,0xd8)
255(1111 1111,0xff)

用十六进制数更方便,0x标志16进制数。

视频中还提到,需要恢复数据,找到对应的jpg开头的三个字节(0xff, 0xdb,0xff),也许可行。

BMP格式,BMP文件前几个字节会存储图像高度、宽度,还能看到BMP基于RGB原理的信息。


通过,jpg,BMP,过渡到了 Data Structure。

又是好难理解的一部分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值