通过一个小例子来简单理解C语言中的内存空间管理

2020-01-06 14:04:43王冬梅
  • main:  stwu 1,-32(1) 
  • mflr 0  stw 0,36(1) 
  • stw 31,28(1)  mr 31,1 
  • lis 9,.LC0@ha  la 9,.LC0@l(9) 
  • lwz 0,0(9)  lbz 9,4(9) 
  • stw 0,12(31)  stb 9,16(31) 
  • li 0,0  stb 0,17(31) 
  • li 0,0  stb 0,18(31) 
  • li 0,0  stb 0,19(31) 
  • li 0,0  stb 0,20(31) 
  • li 0,0  stb 0,21(31) 
  • lis 9,.LC1@ha  la 3,.LC1@l(9) 
  • crxor 6,6,6  bl printf 
  • li 0,0  mr 3,0 
  • lwz 11,0(1)  lwz 0,4(11) 
  • mtlr 0  lwz 31,-4(11) 
  • mr 1,11  blr 
  • .size main, .-main  .comm tt,400,4 
  • .comm ii,4,4  .ident "GCC: (GNU) 4.2.3" 
  • .section .note.GNU-stack,"",@progbits 

    Note: 一般编译器和操作系统实现来说,对于虚拟地址空间的最低(从0开始的几K)的一段空间是未被映射的,也就是说它在进程空间中,但没有赋予物理地址,不能被访问。这也就是对空指针的访问会导致crash的原因 ,因为空指针的地址是0。至于为什么预留的不是一个字节而是几K,是因为内存是分页的,至少要一页;另外几k的空间还可以用来捕捉使用空指针的情况。


    注:相关教程知识阅读请移步到C++教程频道。