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

关于《C语言接口与实现》中一句话的理解有关问题

2012-02-16 
关于《C语言接口与实现》中一句话的理解问题在《C语言接口与实现》的第58页中间有这样一段话: set bp if ptr

关于《C语言接口与实现》中一句话的理解问题
在《C语言接口与实现》的第58页中间有这样一段话:
< set bp if ptr is valid >=
  if (((unsigned long)ptr)%(sizeof(union align))!=0 || (bp = find(ptr) == NULL || bp->free)
  Except_raise(&Assert_Failed, file, line);
其中的测试语句((unsigned long)ptr)%(sizeof(union align))!=0避免了对无效地址调用find函数,这些地址不是最严格的地址边界的倍数,因此不可能是有效的存储块指针”。
  就像下面要说的那样,Mem_alloc返回的指针总是俺某个地址的边界调整过的,该地址是以下公用体大小的倍数:
  union align{
  int i;
  long l;
  long *lp;
  void *p;
  void (*fp)(void)
  float f;
  double d;
  long double ld;
  }
这种边界调整保证任何类型的数据都可以保存在由Mem_alloc返回的存储块中。如果传递给Mem_free的ptr没有按照这个边界调整,那它可能不在htab中,因此可能是无效的。

这段意思我的理解是,凡是是union align的整数倍的地址才会被存到htab指针数组里,不明白的是,为什么要以union align这个公用体的大小作为尺寸标准呢?

[解决办法]
union align 里面包含了常用的变量类型,基本上在各个平台都可以使用了。

以32位平台为例,通常int long 指针和函数指针 float 是四字节的,double是八字节的,long double是十字节。那么,align就会至少以十字节做边界调整,实际值可能为12或者16字节。

热点排行