面试题练习01

来源:互联网 发布:大数据上市公司有哪些 编辑:程序博客网 时间:2024/05/16 14:32

试卷二

一、填空选择题

1、请写出 char *p 与“零值”比较的 if 语句    if(p == NULL)                        

 

2、写出打印结果___255____

 #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;
}

 

3、分析输出结果______8 8________________

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

 

4、f(657, 789)_________673_______

int f(int x, int y)

{

return (x&y)+((x^y)>>1)

}

5、Linux文件权限一共10位长度,分成四段,第三段表示的内容是___C__________

A、文件类型

B、文件所有者的权限

C、文件所有者所在组的权限

D、其他用户的权限

 

二、简答题

1、用变量a给出下面的定义
1) int a;            一个整型数;

2) int *a;           一个指向整型数的指针

3) int **a;          一个指向指针的的指针,它指向的指针是指向一个整型数
4) int a[10];        一个有10个整型数的数组
5) int *a[10];      一个有10个指针的数组,该指针是指向一个整型的
6) int (*a)[10];    一个有10个整型数组的指针
7) int (*a)(int);    一个指向函数的指针,该函数有一个整型参数并返回一个整型数
8) int (*a[10])(int);   一个有10个指针的数组,改指针指向一个函数,该函数有一个有一个整型的参数返回值是一个整型数;

 

2、关键字const的作用是什么?

 

(1):欲阻止一个变量被改变,可以使用const关键字,在定义该const变量时,通常需要对其

初始化,因为以后就没有机会改变这个这个变量。

(2)对指针来说,可以指定指针的本身就是const,也可以指定指针所指的数据为const,或者同时指定为const.

(3)在一个函数的声明中,const可以修饰形参,标明它是一个输入参数,在函数的内部不能改变其值

(4)对于类的成员函数,若指定为const类型,则标明其是一个常函数,不能修改类的成员变量。

 

 

 

 

 

3、内存的分配方式的分配方式有几种?

1)静态的分配,在编译的时候就已经分配好空间的,在整个程序的运行的期间都存在

 如:全局变量,static变量

(2)在栈上上创建,在执行函数的时候,函数局部变量在栈上创建,在执行完成后,系统会自动的释放那些内存,栈内分配的运算的处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)在堆上分配,也叫动态分配,动态的分配的内存的空间存在的时间,有编写的程序员所决定的,如果分配了,那么苏姚收回它,否则运行的程序会出现内存的泄漏,频繁的分配和释放不同大小的堆栈的空间会产生堆内的碎块。

 

4、进程和线程的区别

 

线程:没有地址孔家,多线程共享资源,多线程的系统的系统处理高并发操作的效率高

进程:有独立的地址空间,多个进程之间资源保密。

进程与线程的主要的区别,在于他们不同的操作系统的资源的管理的方式。

每个进程有自己的独立的地址空间,也就意味着进程之间资源是保密的,一个进程崩溃了,

在保护模式下,并不会对其他的进程产生影响,而一个线程只是一个进程中不同的执行的路径。每个线程都有自己的堆栈空间与局部变量,但是,线程回见没有独立的地址空间,一个线程死掉,整个进程就会死掉。

简单的说:

进程是资源分配的最小的单位

线程是程序执行的最小的单位

进程有独立的地址空间,一个进程崩溃后,在保护模式下,其他的进程不会受到影响,

线程是进程中的不同的执行的路径,一个线程崩溃,那么整个进程就会崩掉。

 

 

 

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

 1)无名管道通信:

1.较早的一种通信方式,缺点:只能用来亲缘关系进程之间的通信,只支持单向的数据流,如果要双向的通信,需要创建多个管道;

2.自身具备同步的机制

3.随进程持续

(2)有名管道:

1.支持不是亲缘之间的通信,,和内存共享类似,提供一个路径的名字,将各个没有亲缘关系的进程关联在一起,但是需要创建两个描述符来实现双向的通信。

2.自身具备同步的机制

3.随进程持续

  3)共享内存:

1.最快的一种通信方式,多个进程可同时的访问同一片内存的空间,相对其他的方式,更少的数据的拷贝,效率较高。

2.需要结合信号灯和其他的方式来实现多个进程之间 同步,自身不具备同步机制

3.随内核持续,相比于随进程持续的生命力更强

   4)信号量:

1.这种的通信携带的信息极少,不适合需要经常携带数据的通信。

2.不具备同步的机制,类似于中断,什么时候产生信号,进程是不知道的。

   5)消息队列:

1.与内存共享和有名管道类似,使用一个路径名来实现各个无亲缘关系的进程之间的通信。但是它的优点是:它提供有格式的字节流,减少了开发人员的工作量,消息具有类型额优先级

2.具备同步的机制;

3.随内核持续;

(5)socket:

1.实现起来简单,可以使用因特网域和linux域来实现,使用英特网域可以实现不同主机之间的通信

2.自带同步机制,

3.随进程持续;

 

 

 

 

 

 


三、程序题

1、C语言库函数里是否有将字符串转化为数字的函数,若有则用自己的方式实现它。

 

int  my_stoi(char const*src)

{   int falg = 1;

int num = 0;

char * temp  = src;

if( (*temp) ==-)

{

    flag = -1;

    temp++;

}

while(*(temp++)  != \0)

{

   num = num *10 + (*temp)-0;

}

    return flag * num;

}

 

 

 

2、编写一个程序,实现输出链表中倒数第K个结点

 

void print_k(int k, Node *head)

{

Node *temp;

int num;

int i;

temp = head;

 

while(temp != NULL)

{

    num++

    temp = temp ->next;

}

temp = head;
    for(i = 0; i < num -k; i ++)

{

    temp = temp->next;

}

printf(result = %d\n,temp->data);

}

 

0 0