深信服凉经

深信服凉经

1.有关sizeof的问题

struct node {
    int a;
    char b[0]; 
}; 
printf("%d",sizeof(node)); 

2.tcp如何保证可靠传输?

3.两个线程对一个数据结构操作不用锁,例如一个线程对链表加,一个对链表减。

4.什么是字节对齐?为什么要字节对齐?为什么字节对齐会比较快?

5.new和malloc的区别,,它们没申请到内存会出现什么情况?

6.oj评测系统如何防止别人提交搞破坏的代码?

7.为什么有时上传大文件会非常的快?

8.怎么从一大堆的hash值中找某个hash值是否存在?

9.printf怎么实现可变参数

10.stl中map的实现

11.假如要hash的值是一个结构体,怎么解决?

12.写一个c程序判断cpu是大端还是小端?

13.写一个链表反转

14.了解僵尸进程吗?

15.进程的通信

16.stl中迭代器什么时候会失效?

17.了解网络编程吗?socket

18.主机字节序和网络字节序为什么要互相转换?

19.函数调用后,怎么知道回来的地方

20.函数参数的入栈顺序

1.有关sizeof的问题

struct node {
    int a;
    char b[0]; 
}; 
printf("%d",sizeof(node)); 

我回答是8个字节,答案是4个字节。。。
char b[0]叫做柔性数组
b只是一个数组名,不占空间。

#include<cstdio>
#include<malloc.h>
struct node
{
    int len;
    int a[0];
};
int main()
{
    node *p=(node*)malloc(sizeof(node)+sizeof(int)*10); //申请空间
    p->len = 10;
    for(int i=0; i<10; i++)
        p->a[i]=i;
    for(int i=0; i<10; i++)
        printf("%d\n",p->a[i]);
    free(p);                                            //释放空间
    return 0;
}

2.tcp如何保证可靠传输?

确认应答、超时重传、连接管理

3.两个线程对一个数据结构操作不用锁,例如一个线程对链表加,一个对链表减。

4.什么是字节对齐?为什么要字节对齐?为什么字节对齐会比较快?

当时就回答了1,2。
1.为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的”对齐”.比如4字节的int型,其起始地址应该位于4字节的边界上.
2.便于CPU快速访问
3.32位机中CPU一次读4个字节。如果一个int起始位置在2上,CPU就要读两次,第一次读2,3位上的short,第二次读4,5位上的short,然后组合成int,如果是int在3号的位置则要3次char + short + char

5.new和malloc的区别,它们没申请到内存会出现什么情况?

new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。
new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。(我没试过new分配失败会怎么样,就回答了抛异常返回null)
new/delete会调用构造/析构函数 malloc/free只是申请/释放空间
new -> operator new -> malloc
new可以被重载

6.oj评测系统如何防止别人提交搞破坏的代码?

7.为什么有时上传大文件会非常的快?

云上有很多文件,对这些文件做hash得到个hash表,如果上传的文件已经在上面就不用传了。然后问我还有没有别的方法?

8.怎么从一大堆的hash值中找某个hash值是否存在?

字典树

9.printf怎么实现可变参数

VA_LIST的用法:
(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针
(2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
(4)最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。

void my_printf(char *format, ...)
{
    va_list arg;    //char *
    va_start(arg, format);
    for(int i=0;i<3;i++)
    {
        putchar(va_arg(arg,int));
    }
    va_end(arg);
}
int main()
{
    my_printf("",'c','d','z');
    return 0;
}
//输出cdz

对字符串format进行判断,比如%以确定有几个参数,当时也不懂c可以传...

10.stl中map的实现

11.假如要hash的值是一个结构体,怎么解决?

12.写一个c程序判断cpu是大端还是小端?

当时大端小端都不清楚。。。后面面试官解释了下,我就说存一个int,看看可不可以取个地址输出一部分。。。
下面是正确代码,如果是输出 78 56 34 12是小端,反之为大端

unsigned int a = 0x12345678;
char *p1 = &a;
printf("%0x %0x %0x %0x",p1[0],p1[1],p1[2],p1[3]);

13.写一个链表反转

14.了解僵尸进程吗?

15.进程的通信

信号、管道、消息队列、共享内存

16.stl中迭代器什么时候会失效?

17.了解网络编程吗?socket

18.主机字节序和网络字节序为什么要互相转换?

小端存储:低地址存放数据的高位
大端存储:高地址存放数据的高位
通行时 a主机字节序 -> 网络字节序 ->b主机字节序
网络字节序是大端,主机序是主机自己的处理数据的方式

19.函数调用后,怎么知道回来的地方

当调用函数时,将主程序代码行的下一条指令的地址保存到栈中;当函数返回时,程序就会从栈中获取该地址,并从那一点继续向下执行。在函数调用了其它函数的情况下,将每一个返回地址都放到栈中;当函数结束时,就可以找到它们在栈中的地址。(微机课听到都还给老师了。。。当时没有回答出来)

20.函数参数的入栈顺序

C程序栈底为高地址,栈顶为低地址,参数入栈顺序是从右至左的。

猜你喜欢

转载自www.cnblogs.com/xcantaloupe/p/10506107.html