32位机器上,以下结构的sizeof(P)为
struct A {
int a;
char b;
int c;
char d;
}
struct P {
struct A w[2];
short b;
struct A* p;
}
/*考察结构体对齐和填充:
结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果不是,编译器会自动在成员间填充。*/
- struct A {
int a; //4 bytes
char b; //1 bytes
//char pad[3] //3 bytes
int c; //4 bytes
char d; //1 bytes
//char pad[3] //3 bytes
} // total = 16 bytes
/* P中有结构体A的成员,但是计算时按照A中数据类型确定的*/
struct P {
struct A w[2]; // 2 * 16 bytes
short b; //2 bytes
//char pad[2] //2 bytes
struct A* p; //4 bytes
} // total = 40 bytes
下列关于const和#define定义常量的区别,说法不正确的有?
define宏是在预处理阶段展开。const常量是编译运行阶段使用
宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)
const定义和#define定义的常量在程序运行过程中只有一份拷贝
A,正确,#define定义的宏是在预处理阶段进行替换的,const常量是在编译、运行阶段进行使用的。
注意是仅仅的字符串替换,并不会检查其合法性。
预处理阶段做了的任务:
1:将头文件中的内容(源文件之外的文件)插入到源文件中
2:进行了宏替换的过程(简单的字符串替换),定义和替换了由#define指令定义的符号
3:删除掉注释的过程,注释是不会带入到编译阶段
4:条件编译
B,正确,所有的宏替换只是简单的字符串替换,注意是字符串替换,所以并不会检查其合法性,而const定义的常量依然是内置类型等,所以会对其进行类型安全检查。
C,正确,宏定义在程序中使用了几次在预处理阶段就会被展开几次,并不会增加内存占用,但是宏定义每展开一次,代码的长度就要发生变化(所以有利必有弊啊!),而const常量也会为其分配内存(如果是动态申请空间肯定就是堆中了)。
D,错误,const定义的常量只有一次拷贝没毛病,而define定义的变量在内存中并没有拷贝,因为所有的预处理指令都在预处理时进行了替换。
解答:
在TCP/IP中,ICMP属于哪一层协议?**
答:ICMP协议是IP层的附属协议,是介于IP层和TCP层之间的协议,一般认为属于IP层协议。IP协议用它来与其他主机或路由器交换错误报文和其他的一些网络情况。在ICMP包重携带了控制信息和故障恢复信息。
ICMP报文有两种类型,即ICMP差错报告报文和ICMP询问报文。
设在一棵度数为3的树中,度数为3的结点数有2个,度数为2的结点数有1个,度数为1的结点数有2个,那么度数为0的结点数有( )个。
答:根据图论中树的公式:顶点数 - 1 = 边数,设出度为0的结点有y个,列方程求解。其中顶点数为2+1+2+x,边数为2 x 3+1 x 2+2 x 1。解出来得 y = 6
500张骨牌整齐地排成一行,按顺序编号为1、2、3、……、499、500。第一次拿走所有奇数位置上的骨牌,第二次再从剩余骨牌中拿走奇数位置上的骨牌,以此类推。请问最后剩下的一张骨牌的编号是?
答:
第一次后剩下250个偶数:2,4,6,8......498,500(2的倍数留下,2的一次方)
第二次后剩下125个偶数:4,8,12,16......496,500(4的倍数留下,2的二次方)
第三次后剩下62个偶数:8,16,24....488,496(8的倍数留下,2的三次方)
..........................................................................
第八次后留下的1个偶数:256(2的八次方倍数留下)
所以答案选C
Linux 文件权限一共 10 位长度,从前数第 5-7 位表示的内容是
答:第一位表示是文件或者目录,2~4是用户权限, 5~7是组权限 ,8~10是其他用户权限
关于TCP可靠数据传输服务的论述,正确的是
答:
A.错误。不一定需要超时才重传,出错了也可以重传;
B.错误。错在于这个时间间隔不是固定的。超时时间间隔 RTO,如果太短可能导致大量不必要的重传,如果太长则会导致性能下降;所以超时时间间隔 RTO是通过往返时间RTT算出来的。TCP 采用了一个高度动态的算法,来不断的调整时间间隔,总之超时时间间隔不是固定的~
C.错误。TCP是面向连接的,提供可靠服务的,所以需要对乱序到达的分组进行确认以及重排。
D.正确。如果发送方收到连续3条的同一个序列号的ACK,那么就会启动快速重传机制,不需要等到timeout,把这个ACK对应的发送包重新发送一次。
引入二叉线索树的目的是()
答:加快查找结点的前驱或后继的速度。
用邻接表表示图进行广度优先遍历时,通常是采用()来实现算法的
答:记得广度优先用队列,深度优先用栈。
ava中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市。正则表达式为()
答:
(?=Expression)
顺序肯定环视,表示所在位置右侧能够匹配Expression
(?=()*就是匹配正括号, 因为(需要转义, 所以要再前面加斜线
前面的.*?是非贪婪匹配的意思, 表示找到最小的这样的匹配即可。
否则, 因为后面也有括号, 会匹配到 北京市(海淀区)(朝阳区)
编程:今年的第几天?输入年,月,日,计算该天是本年的第几天。
tips:这里的重点主要就是有关闰年的判断?在二月的天数 + 1;
代码截图:
问:计算机系统中判别是否有中断事件发生应是在()
答:应该发生在执行完一条指令后。
问:某系统中有 3 个并发进程,都需要同类资源 4 个,试问该系统不会发生死锁的最少资源数是:
答:注意极限情况问题,极限情况是每个并发进程都已经有了三个资源,此时一共有9个,那么只需要再有一个资源就可以使一个进程完成操作任务,释放资源之后循环。所以需要的最少资源数是 10 个。
问:下面有关共享内存,说法不正确的是?
答:共享内存不提供同步 参考 JMM java内存模型
尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的。(这句话是正确的)