9月26号微软笔试总结之sizeof

26号的微软笔试是我开始求职之旅的第一场笔试,之前没有太准备, 完全是去打酱油的,也顺便提醒一下要开始进入找工作的状态了。前面的10道选择题,算法、复杂度的偏多,比较注重细节,最后的一道算法题没写完,思路也有点错误。这里总结一下笔试时遇到的问题。


sizeof 问题


有一道题出现了代码: char p[] = { 'a', 'b', 'c', 'd', 'e', 'f' },  int i = sizeof(p)/sizeof(p[0]); 我当时以为p表示指针,sizeof(p)=4,其实sizeof(p) = 6 * 1 = 6. 而i就表示字符数组p的含有字符的个数嘛。

总结:
1、sizeof 是一种单目操作符,不是函数。sizeof计算数据(变量、类型、数组、结构体)所占内存空间大小,以字节为单位。sizeof用于变量时可以不用括号,如 sizeof val; sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。

2、一个指针的sizeof 结果为4. 字符类型 char 为1字节

3、对于静态数组,sizeof表示数组的总字节数
int a[10]; char b[] = "hello";
sizeof(a) = 10*4 = 40
sizeof(b) = 6*1 = 6
当数组做形参时,数组名做指针用
func(int a[])
{
     sizeof(a) = 4.
}

4、sizeof与strlen的区别:strlen的参数只能是char* 且必须是以''\0''结尾的。

5、 struct的sizeof结果,会涉及到内存对齐问题,具体看这篇文章,图文并茂非常详细:http://www.cnblogs.com/shitouer/archive/2010/04/07/1706588.html
这里也简单说下
struct X
{
     char c;
     int i;
     double d;
     char c2;
}
sizeof(X) = 1 + (3) + 4 + 8 + 1 + (7) = 24.
#pragma pack默认为8
1)对结构的数据成员,第一个数据成员位于偏移为0的位置,以后每个数据成员的偏移量必须是MIN(#pragma pack()指定的数,此数据成员的自身长度) 的倍数。
2)为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节(填充字节为CC,也就是int3中断),以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。
3)在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照MIN(指定的#pragma pack()的数值,MAX(结构(或联合)数据成员长度))进行对齐。

感觉一篇文章还是不要涉及到太多问题,所以接下来的问题准备分开写,笔试中也考到了堆、栈的问题。




posted @ 2010-09-28 15:38  Adriano  阅读(490)  评论(0编辑  收藏  举报