首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

C专家编程精粹第二篇-C对内存的使用,底层探索

2012-08-14 
C专家编程精华第二篇----C对内存的使用,底层探索这里以Linux中C编程为例,有些东西可能在不同的系统中处理

C专家编程精华第二篇----C对内存的使用,底层探索

这里以Linux中C编程为例,有些东西可能在不同的系统中处理是不一样的

/**************运行时:内存的布局****************/

以下面这段程序为例:

以我自己的电脑为例,系统会一次性提取8个字节的内存,那么上面那个结构体对它sizeof,name会占3*8=24字节,多余了3个字节,但是紧接着定义的int型不能刚好放到多余的3个字节里,所以有开辟8个字节放number,这里又多余了四个字节,显然id的8字节是不能放到四个字节里的,所以有开辟8个字节放id,总共sizeof之后就是5*8=40字节了。

如果将name大小改为25,有4*8=32字节容纳它,多了7个字节,能够容纳number,那么就相当于多余了7-4=3字节了,显然id不能放到3字节里,开辟8字节容纳id,这样sizeof之后仍未5*8=40字节

为了更好的节省内存空间,我们需要注意类似的变量定义的先后顺序,将number和name的位置交换结果又不一样,因为指令是逐条执行的。

(3)段错误

(还有一种总线错误,真心还没弄懂,求高手指点)

段错误是由于内存管理单元异常所致,导致段错误有以下几个原因:

1、解引用一个包含非法值的指针,也就是对一个已经free掉的内存继续使用

2、解引用一个空指针,一般就是初始化为NULL了还对它进行解引用,还可能是从函数中返回了NULL却没有进行检查就直接使用

3、对超过了申请内存边界的内存进行解引用,有点像数组的越界一样

4、把你的电脑可用动态内存用完了。。。。这个几乎很困难

热点排行