本文共 1800 字,大约阅读时间需要 6 分钟。
这节课讲内存(Memory),听了半节课,云里雾里的。
直到听到关键词:地址、指针。C语言程序设计 中有有好几章讲指针。比视频中更容易理解一些。
以下内容摘抄自 C语言程序设计 第9章:
int i;
, 系统为变量i 分配4个字节的存储单元。 下面的图更清楚些,定义一个变量时,系统会在内存中为变量分配一块空间。
例如上面为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字节的存储空间。
如果这条语句在一个普通函数中,不停地被调用,即不停请求分配40字节的存储空间。
系统内存会一直被占用,内存越来越少,即 内存泄漏 。解决办法是,每次请求分配存储空间后,使用free()
释放内存。
然后,stack overflow(堆栈溢出)(著名网站)。
看下面的例子:
程序中请求为name
变量分配9个字节的内存空间,即能存储9个字符。
FengWeilei
10个字符,将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。
又是好难理解的一部分。