一些测试题的思路与答案

来源:互联网 发布:linux命令行新建文件 编辑:程序博客网 时间:2024/04/28 09:28

1.下面程序的输出结果是()

#include<stdio.h> #include<string.h> int main() {    char a[1000];    int i;    for(i=0;i<1000;i++)    {      a[i]=-1-i;      }    printf("%d",strlen(a));    return 0;}
答案是255。

因为char的数范围是-128到127,当i为127时,a[127]的值是-128。当i继续增加时,因为char类型只有8位,所以舍弃最高位,所以a[128]不是-129,而是0x7f,当i == 255时,-256的低8位是0,也就是ASCII码'\0',所以strlen函数返回值是255。


2.

分析输出结果

int arr[] = {6,7,8,9,10};int *ptr = arr;*(ptr++)+=123;printf(“ %d %d ”, *ptr, *(++ptr));
答案是8 8

因为*(ptr++)+=123的实际意义是指针后移,数据上并没有变化,而后面的输出语句是先执行的++ptr,然后在输出,因为++ptr是先加再运算,所以输出的史诗8 8。


3.进程和线程的区别

进程是资源分配的最小单元,具有一定独立功能的程序的一次活动。

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

1)简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。


4.进程间通信方式有哪些?各自有哪些优缺点?

管道(有名和无名),信号,消息队列,信号灯,共享内存,套接字

无名管道简单方便.但局限于单向通信的工作方式.并且只能在创建它的进程及其子孙进程之间实现管道的共享:有名管道虽然可以提供给任意关系的进程使用.但是由于其长期存在于系统之中,使用不当容易出错.所以普通用户一般不建议使用。消息缓冲可以不再局限于父子进程.而允许任意进程通过共享消息队列来实现进程间通信.并由系统调用函数来实现消息发送和接收之间的同步.从而使得用户在使用消息缓冲进行通信时不再需要考虑同步问题.使用方便,但是消息队列中信息的复制需要额外消耗CPU的时间.不适宜于信息量大或操作频繁的场合。共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点。但是共享内存的通信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的.因此,这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其他同步工具解决。另外,由于内存实体存在于计算机系统中.所以只能由处于同一个计算机系统中的诸进程共享,不方便网络通信。不同的进程通信方式有不同的优点和缺点.因此.对于不同的应用问题,要根据问题本身的情况来选择进程间的通信方式。





0 0
原创粉丝点击