一、C语言面试

C语言面试题大汇总之华为面试题

二、链表

1、static和extern:

1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 
2). 一个被声明为静态的变量可以被模块内所用函数访问,但不能被其他文件函数访问。它是一个本地的全局变量。 
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用,这个函数被限制在声明它的模块的本地范围内使用。

C++中的static

在C++中static还具有其它功能,如果在C++中对类中的某个函数用static进行修饰,则表示该函数属于一个类而不是属于此类的任何特定对象;如果对类中的某个变量进行static修饰,表示该变量为类以及其所有的对象所有。它们在存储空间中都只存在一个副本。可以通过类和对象去调用。对于静态成员函数,只能访问静态成员函数和静态成员变量,不能访问非静态成员函数或者变量。

extern:引用其他文件的函数或变量

2、内存泄漏:

申请内存后要删除,new和delete的使用

确保您不是在访问空指针

malloc和free一起使用

fwrite和write区别:

fwrite带缓冲,write不带缓冲。一个8k的文件,指定缓存大小为2k,则需要4次系统调用,fwrite自动分配缓冲,一次调用。
操作系统会定期地把这些存在内核缓冲区的数据写回磁盘中。而fwrite不一样,fwrite每次都会先把数据写入一个应用进程缓冲区,等到该缓冲区满了,系统会调用write一次性把相应数据写进内核缓冲区中减少了系统调用(即write调用)。

C语言编译过程:

C语言编译过程分成四个步骤: 
1,由.c文件到.i文件,这个过程叫预处理 
2,由.i文件到.s文件,这个过程叫编译 
3,由.s文件到.o文件,这个过程叫汇编 
4,由.o文件到可执行文件,这个过程叫链接

宏的本质:预处理阶段的单纯的字符串替换

预处理阶段,不考虑C语法

3、线程和进程:

(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
(3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
(4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源

线程、进程间通信:

进程线程间通信:

1、共享内存

2、信号量:不具备数据传输的功能,只是一种外部资源的标识。当请求一个使用信号量的资源时,进程需要先读取信号量的值,当信号量大于0时,表示有资源可以请求。当进程不再使用一个信号量控制的共享资源时,此信号量值加一。

3、消息队列:是一个消息的链接表

4、读写锁:多个读线程可以共同占有一把读写锁,写线程任意时刻只能有一个占有读写锁

5、互斥锁:每次只有一个线程可以得到锁进行操作,其余的线程都因为得不到锁而处于阻塞状态。

sizeof是求数据类型所占的空间大小,而strlen是求字符串的长度,字符串以/0结尾。

内存分配方式:

静态存储区:全局变量(不在main函数内)和static变量

堆:动态分配内存,除了malloc,其他都不在堆上被创建

栈:局部变量,函数参数;char *p;

4、const、typedef和define区别

typedef:声明新的类型名来代替原有的类型名;比如typedef int INTERGER,相当于用INTERGER代表int类型。Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字

define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。

const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。

define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。

define可以用来防止头文件重复引用,而const不能

#if!defined(AFX_…_HADE_H)
#define(AFX_…_HADE_H)
#endif

答:防止该头文件被重复引用。

5、define比较两个值,返回小的

#define MIN(A,B) ((A)<=(B)?(A):(B))

6、strlen和sizeof比较

strlen返回长度,字符串以'\0'结尾,sizeof为占的字节数

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

memcpy:内存拷贝

man使用

7、不用strcpy拷贝字符串

int a[100],int b[100],i=0;
while(a[i]!='\0')
{
b[i]=a[i];
i++
}

5、冒泡排序:

void bubble_sort(int a[], int n)
{int i, j, temp;for (j = 0; j < n - 1; j++)for (i = 0; i < n - 1 - j; i++){if(a[i] > a[i + 1]){temp = a[i];a[i] = a[i + 1];a[i + 1] = temp;}}
}

6、置BIT为1

1<<3=1*(2^3)=8,8>>2=8/(2^2)=2;

/求商,%求余数

#define BIT3 (0x1<<3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}

29、分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。
答:BOOL : if ( !a ) or if(a)
int : if ( a == 0)
float : const EXPRESSION EXP = 0.000001
if ( a < EXP && a >-EXP)

pointer : if ( a != NULL) or if(a == NULL)

30、MJPEG和JPEG区别:

MJPEG:静止图像压缩技术,高清晰度

JPEG:动态压缩技术,占用空间小

YUV:原始数据。

32、用两个栈实现一个队列的功能?要求给出算法和思路!
答 、设2个栈为A,B, 一开始均为空.
入队:
将新元素push入栈A;
出队:
(1)判断栈B是否为空;
(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;
(3)将栈B的栈顶元素pop出;
这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好

答 、设2个栈为A,B, 一开始均为空.
入队:
将新元素push入栈A;
出队:
(1)判断栈B是否为空;
(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;

(3)将栈B的栈顶元素pop出;

36. 如何打印出当前源文件的文件名以及源文件的当前行号?
答案:
cout << __FILE__ ;
cout<<__LINE__ ;

__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的

10、段错误调试:

设置core文件的最大值 ,程序执行会产生core文件,用gdb进行调试;strace工具使用

11. 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。

答案:

/*
编写strcpy函数(10分)
已知strcpy函数的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不调用C++/C的字符串库函数,请编写函数 strcpy
(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
答:为了 实现链式表达式。 // 2分
例如 int length = strlen( strcpy( strDest, “hello world”) );

*/

#include <assert.h>
#include <stdio.h>
char*strcpy(char*strDest, constchar*strSrc)
{
assert((strDest!=NULL) && (strSrc !=NULL)); // 2分
char* address = strDest; // 2分
while( (*strDest++=*strSrc++) !='\0' )// 2分
NULL;
return address ; // 2分
}另外strlen函数如下#include<stdio.h>
#include<assert.h>
int strlen( constchar*str ) // 输入参数const
{
assert( str != NULL ); // 断言字符串地址非0
int len = 0;
while( (*str++) !='\0' )
{
len++;
}
return len;
}

这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好

30、一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
答:将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。

31、Http协议

客户端请求消息

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。默认端口80,或者8080

请求方法:GET和POST;

无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接

服务器响应消息

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

Http状态码:200  ---请求成功    301---资源被转移到其他URL   404----请求资源不存在  505--内部服务器错误

socket编程:

socket():    调用成功返回一个小的非负的整数值,为套接字描述符;失败返回-1

connect():    激发TCP3次握手,返回错误如下:

1、服务器宕机,客户端阻塞recv调用,返回ETIMEDOUT ;客户端不发送数据则无法检测,使用SO_KEEPALIVE检测奔溃

2、服务器奔溃后重启,返回ECONNRESET错误

3、服务器关机,服务端发送一个FIN给客户,recv返回0,客户端提示服务器过早终止,使用select或poll检测

bind():     返回的一个常见错误是EADDRINUSE,表示地址已使用,设置套接字选项SO_REUSEADDR

listen();

accept();    使服务器接受客户端的请求,将完成队列中的队头条目返回给进程,产生一个新的套接字描述符

数据传输函数:write()函数调用成功返回发送的字节数,出错返回-1;read()函数调用成功返回接收的字节数

send() :recv();多flags参数,传输控制标志,返回值和write一样

close();关闭描述符,调用成功返回0,失败-1

TCP套接字:面向连接的通信socket->bind()->listen()->accept()

UDP套接字:

sendto():    发送数据,类似标准的write,但是要指定目的地址;struct sockradd ,addrlen

recvfrom():接收数据,类似标准的read,但是要指明目的地址

14.面向对象技术的基本概念是什么,三个基本特征是什么?

答:基本概念:类、对象、继承; 基本特征:封装、继承、多态。

封装:将低层次的元素组合起来形成新的、更高实体的技术;
继承:广义的继承有三种实现形式:实现继承、可视继承、接口继承。
多态:允许将子类类型的指针赋值给父类类型的指针

多态:是对于不同对象接收相同消息时产生不同的动作。C++的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;

从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类

抽象类中不仅包括纯虚函数,也可包括虚函数。抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。

C++:

继承:基类和派生类;男人继承人,但有自己独特的属性

多态:一个接口多种方法,,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。

静态多态:在函数和运算符的重载

动态多态:虚函数

虚函数:在基类中冠以关键字 virtual 的成员函数。 它提供了一种接口界面。允许在派生类中对基类的虚函数重新定义。

纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用。

C语言面试基本点整理相关推荐

  1. C语言面试基础知识整理

    一.预处理 1.什么是预编译?何时需要预编译? (1)预编译又称预处理,是做些代码文本的替换工作,即程序执行前的一些预处理工作.主要处理#开头的指令,如拷贝#include包含的文件代码.替换#def ...

  2. 安卓高级面试知识整理

                                                    安卓高级面试知识整理 Android 四大组件:这是一份全面 & 详细的Activity学习指南 ...

  3. Android面试资料整理

    文章目录 前言 面试问题整理 Android 问题 一.Activity 1.Activity 的生命周期 2.onStart()和onResume().onPause()和onStop()的区别? ...

  4. *Java软件开发面试知识整理*

    Java软件开发面试知识整理 围绕以下几点回答问题:是什么.为什么.什么时候用.项目实现.解决什么问题.遇到的困难 谈谈你对Java和C的理解? Java: 面向对象.Unicode:可以跨平台(JV ...

  5. c语言字节的高地位互换,c语言面试题目100及最佳答案(51页)-原创力文档

    c语言面试题目100及最佳答案 作为IT行业人士需要掌握的最基本的计算机语言-c语言,如今的地位只高不低,c语言掌握程度的高低往往在面试的时候可以完全表现出来,而有些问题是大家平时似乎是知道的,但却不 ...

  6. iOS开发面试知识整理 – OC基础 (二)

    iOS | 面试知识整理 – OC基础 (二) 1.C和 OC 如何混编 xcode可以识别一下几种扩展名文件: .m文件,可以编写 OC语言 和 C 语言代码 .cpp: 只能识别C++ 或者C语言 ...

  7. 【面试题】某司社招面试题目整理及答案

    某司社招面试题目整理及答案 Java基础部分 HashMap的实现原理 如何解决Hash碰撞 HashMap的存储(hash算法.hash冲突.初始化.扩容) HashMap和HashTable的区别 ...

  8. 面试问题整理之操作系统和代码相关问题

    本文为操作系统以及C/C++相关面试问题整理.持续更新的更多更详细攻略可见这里,欢迎点星点关注 1.引用和多态的区别? 引用是除指针外另一个可以产生多态效果的手段.这意味着,一个基类的引用可以指向它的 ...

  9. 【面试】网易游戏面试题目整理及答案(5)

    网易游戏面试题目整理及答案(5) 算法 操作系统 Linux部分 其他 参考资料 算法 Leetcode 75题:请写出一个高效的在m*n矩阵中判断目标值是否存在的算法,矩阵具有如下特征: 1)每一行 ...

  10. c语言滑稽的编程,12个滑稽的C语言面试问答——《12个有趣的C语言问答》评析(5)...

    A,局部变量的返回地址 Q:下面的代码有问题吗?如果有,如何修改? #include int* inc(int val) { int a = val; a++; return &a; } in ...

最新文章

  1. 阿里三面被挂,幸获内推,历经5轮终于拿到口碑offer
  2. 为什么说康托尔知道聚宝盆的秘密?
  3. CentOS开启FTP及配置用户
  4. python 利用pyttsx3文字转语音 适用于macOS windows树莓派
  5. 威佐夫博弈:百练OJ:1067:取石子游戏
  6. 关于API的设计和需求抽象
  7. Cucumber 入门一
  8. idea创建包怎么让包分层_idea创建Spring项目的方法步骤(图文)
  9. 如何使用 Linq 获取每个分组中的第一个元素?
  10. 中医移动医疗_中医之极简移动医疗
  11. 云计算领导者,自主研发虚级化产品,华胜天成IVCS
  12. linux安全检查与加固报告,linux安全加固文档分析.doc
  13. java word 文档合并_[原创]java合并word文件
  14. 绕过校园网认证实现免费上网【三端】
  15. Linux系统 应急响应自动化检测工具 GScan ——使用教程
  16. 人工智能 - 虚拟人 - 2D/3D 动作捕捉
  17. 《Excel高手捷径:一招鲜,吃遍天》一第18招 怎样在Excel中插入方框内打勾符号(√)和方框内打叉符号(×)...
  18. A. Busiest Computing Nodes
  19. 『方案』《女友十年精华》 ORC 图片 文字识别 详解
  20. 前端实现文件上传(点击+拖拽)

热门文章

  1. 盘点:12个超炫数据可视化工具
  2. Unity实现刺客信条灯光的思路探究
  3. nanodlp micro USB mini USB接线图
  4. Hello CSDN
  5. P2346 四子连棋 题解
  6. NBNS扫描工具nbtscan-unixwiz
  7. python在虚拟解释器环境中使用pip安装第三方库出现Requirement already satisfied错误
  8. C语言回调函数详解(全网最全)
  9. dll反编译工具java_JAVA反编译工具的使用
  10. PHP表格数据Excel转图片输出通用方法,列可自动拓展