练习题答案

来源:互联网 发布:服务器常用端口 编辑:程序博客网 时间:2024/04/28 00:27
1、C    本题考查sizeof和strlen对字符串的处理不同之处,sizeof求出字符串的字符个数,包括结尾符。Strlen求出字符串的实际字符,不包括结尾符。所以答案为6,5,C选项正确。
2、A 函数fun 的功能是返回两个形参的和。调用函数fun(x,y)时,将变量x=6和y=7的值分别传送变量a和b,并且通过语句return a+b;将13返回给主函数。继续调用函数fun (13,z - -),这里z- -指将z的值参与运算后,再将z的值减1操作;将13和8分别传送变量a和b,且通过语句return a+b ;将21返回给主函数。因此A选项正确。
3、ABC
D为什是错的:
volatile 作用是避免编译器优化,说明它是随时会变的,它不是 non-const,和const不矛盾。被const修饰的变量只是在当前作用范围无法修改,但是可能被其它程序修改。所以 
const volatile int i = 0; 表示:
任何对i的直接修改都是错误的,但是i可能被意外情况修改掉,不要做无意义的优化。


4、0x800002
   0x800010
我们定义指针的时候给指针一个类型就是为了方便指针的加减操作。p1是char类型指针,每个char占一个字节,所以p1+2就是在p1的基础上加2个char的长度,就是两个字节。p2是指向64位int型的指针,所以p2+2就是p2加上两个64位int的长度,也就是加上128位,即16个字节。用16进制表示是0x10
所以a=0x800000+0x2=0x800002
a=0x800000+0x10=0x800010


5、D对于双向链表在插入的时候 要对两个指针进行操作,既next 和 prior 指针都要指定到位置
 
如图上所示 在a b 之间插入c  假设a 为p , c为s 在插入过程中
首先把p的下一个节点链接到s上:s->next = p->next
把p->next->prior 链接到s 上 :p->next->prior = s;
把s链接到p上:p->next = s;
把p链接到s->prior 上:s->prior = p;
具体顺序 看好指针别被覆盖就行。
对于上述选项中:
A p->next = s; s赋值给p->next , p->next ->prior = s ,p->next就是s  而s->prior还没确定
B s->prior = p; s->next = p ->next ; p ->next = s; p->next ->prior = s;跟a一样的问题
C p ->next = s;s ->prior = p; p->next ->prior =s; s ->next = p ->next;同a错误一样



1,register 请求编译器尽可能把变量保存在cpu内部寄存器中而省去内存抓取数据的的时间来加快运行速率,一般将频繁被使用的变量声明为register;
使用注意点: 1,不能取地址来获取 
2,是cpu所接受的数据类型 
3,只能修饰局部变量,不能修饰全局变量和函数,静态变量。
2,进程间通信方式包括:
管道(pipe)和有名管道  
    管道是单向的,先进先出的,提供了简单的流控制。进程读空管道或写满管道,都将造成进程阻塞。
    管道包括无名管道和有名管道。前者用于父子进程间通信,后者用于任意两个进程间通信。
信号(signal):产生信号的条件:按键、硬件异常、进程调用Kill函数将信号发送给另一个进程、用户调用Kill命令将信号发送给其他进程。
消息队列 (又称报文队列):一个消息链表,可以把消息看做一个记录,具有特定的格式。进程可以向队列中添加消息或读走消息。
共享内存:被多个进程共享的一部分物理内存,共享内存是进程间共享数据的一种最快的方法。
信号量:主要用于保护临界资源。进程可以根据它来判断是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。
套接字(socket)
      一种文件描述符。有三种类型:
      (1)流式套接字:提供可靠地,面向连接的通讯流。
      (2)数据报套接字:定义一种无连接的服务,通过相互独立的报文进行传输,是无序的。
      (3)原始套接字:用于新的网络协议的测试。
3, 



1.strcpy的实现代码
char * strcpy(char *dst,const char *src)   //[1]
{
    assert(dst != NULL && src != NULL);    //[2]
    char *ret = dst;  //[3]
    while ((*dst++=*src++)!='\0'); //[4]
    return ret;
}
[1]const修饰
源字符串参数用const修饰,防止修改源字符串。
[2]空指针检查
(A)不检查指针的有效性,说明答题者不注重代码的健壮性。
(B)检查指针的有效性时使用assert(!dst && !src);
char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。
(C)检查指针的有效性时使用assert(dst != 0 && src != 0);
直接使用常量(如本例中的0)会减少程序的可维护性。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。
[3]返回目标地址
(A)忘记保存原始的strdst值。
[4]'\0'
(A)循环写成while (*dst++=*src++);明显是错误的。
(B)循环写成while (*src!='\0') *dst++=*src++;
循环体结束后,dst字符串的末尾没有正确地加上'\0'。

2、
http://www.cnblogs.com/en-heng/p/3973679.html
0 0