09 2011 档案
摘要:看下面一道面试题:#include<stdio.h>#include<stdlib.h>int main(void) { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); return 0;} 输出结果为:2,5在这里主要是考察*(a+1)和&a+1的区别了。很显然*(a+1)取的是a[1],然而&a+1取的是什么呢?&a不是首地址加1,而是加上1个a数组大小的偏移。因此ptr实际上等于a+5,所以*(ptr-1
阅读全文
摘要:结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。 内存对齐的原因: 1)某些平台只能在特定的地址处访问特定类型的数据; 2)提高存取数据的速度。比如有的平台每次都是从偶地址处读取数据,对于一个int型的变量,若从偶地址单元处存放,则只需一个读取周期即可读取该变量;但是若从奇地址单元处存放,则需要2个读取.
阅读全文