视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
嵌入式Linux C语言面试试题
2025-09-23 20:59:13 责编:小OO
文档
基础试题(C语言)

 一、ANSI C/C++方面的知识

 一.1、简答题。下面的题目必须全部答对才给分(20分):

 1、 如何在C中初始化一个字符数组。

 2、 如何在C中为一个数组分配空间。

 3、 如何初始化一个指针数组。

 4、 如何定义一个有10个元素的整数型指针数组。

 5、 s[10]的另外一种表达方式是什么。

 6、 GCC3.2.2版本中支持哪几种编程语言。

 7、 要使用CHAR_BIT需要包含哪个头文件。

 8、 对(-1.2345)取整是多少?

 9、 如何让局部变量具有全局生命期。

 10、C中的常量字符串应在何时定义?

 11、如何在两个.c文件中引用对方的变量。

 12、使用malloc之前需要做什么准备工作。

 13、realloc函数在使用上要注意什么问题。

 14、strtok函数在使用上要注意什么问题。

 15、gets函数在使用上要注意什么问题。

 16、C语言的词法分析在长度规则方面采用的是什么策略?

 17、a+++++b所表示的是什么意思?有什么问题?

 18、如何定义Bool变量的TRUE和FALSE的值。

 19、C语言的const的含义是什么。在定义常量时,为什么推荐使用const,而不是#defin

 e。

 20、C语言的volatile的含义是什么。使用时会对编译器有什么暗示。

 一.2、问答题。

 1、-----------------------------------------------------------

 "匈牙利命名法"有什么优缺点?(2分)

 2、-----------------------------------------------------------

 下面x, y, *p的值是多少,有什么问题?(2分)

 int x, y, z = 2;

 int *p=&z;

 x=sizeof*p;

 y=x/*p; /* x=?, *p=?, y=?, 有什么问题?*/

 3、-----------------------------------------------------------

 下面的语句是什么意思?如何声明或定义才使它们更易懂?(10分)

 int (*foo())();

 int (*foo())[];

 int (*foo[])();

 (*(void(*)())0)();

 void (*signal(int,void(*)(int)))(int);

 4、-----------------------------------------------------------

 本题(2分)。一般使用malloc时,需要进行强制类型转换,如:

 char *s; s = (char *)malloc(31);

 下面中?该如何填写,才可以正确执行强制类型转换?

 int (*monthp)[31]; monthp = (?)malloc(31);

 5、-----------------------------------------------------------

 关于C语言运算符优先级的记忆技巧是什么?(2分)

 /* 下面r的值是多少 */

 int hi, low, r;

 hi=7;low=3;

r=hi<<4+low;

 6、-----------------------------------------------------------

 指针和数组的区别是什么?用一个简单的声明把它们区分开。(2分)

 指针和数组的声明在什么情况下是相同的?(2分)

 7、-----------------------------------------------------------

 C语言的左值(lvalue)和右值(rvalue)的含义是什么?(2分)

 8、-----------------------------------------------------------

 为什么C语言可以实现printf(char *format, ...)这样可变参数的调用形式?这样有什

 么缺点?(2分)

 9、-----------------------------------------------------------

 说明C语言中术语"声明""定义""原型"的含义?(2分)

 10、-----------------------------------------------------------

 举一个例子,说明使用assert和防错代码的区别。(5分)

 11、-----------------------------------------------------------

 对语句 if else 与操作符 ? : 使用场合的比较。(2分)

 12、-----------------------------------------------------------

 编写一个函数,输入一个的整型数字,可以选择按照8/10/16进制输出字符串。

 注意边界值。(5分)

 13、-----------------------------------------------------------

 本题(2分)。下面是一个16x16的黑白图标:

 static unsigned short stopwatch[] = {

 0x07c6,

 0x1ff7,

 0x383b,

 0x600c,

 0x600c,

 0xc006,

 0xc006,

 0xdf06,

 0xc106,

 0xc106,

 0x610c,

 0x610c,

 0x3838,

 0x1ff0,

 0x07c0,

 0x0000,

 };

 如何修改声明,可以使之在源代码中形象地表现出图形的模样。

 14、-----------------------------------------------------------

 说出可以使用calendar[11][30]变量的四种类型定义。(5分)

 如:int calendar[12][31]; /* 二维数组 */

 15、-----------------------------------------------------------

 使用strcmp,当字符串相同时会返回'\\0'。但'\\0'一般作为逻辑假,

 因此下面的语句不容易理解:

 if (!strcmp(s, "string")) return EQUATION;

 如何经过简单修改,使之更易懂?(2分)

 16、-----------------------------------------------------------

 编写一个自己的完全C语言版本的memset函数,并且评价这个实现的性能和可移植性。(5

 分)

 17、-----------------------------------------------------------

 在树和图这些数据结构中,通常使用指针来组织数据。如果我们要把这些数据保存到文

 件

 中,指针是没有意义的。我们该如何解决这个问题。(2分)

 18、-----------------------------------------------------------

 用2种不同的方法计算long变量的"1"bit的个数。(2分)

 19、-----------------------------------------------------------

 任意给出一个C的基本数据类型,如何编码判断这个数据类型是有符号还是无符号的?(2

 分)

 不得上机实验,写出下面代码的输出。解释这个行为是标准定义的,还是依赖实现的。(

 2分)

 int i;

for (i = 0; i < 10; i++) {

 int j = i;

 printf ("%d\\n", j);

 }

 20、-----------------------------------------------------------

 列出5种以上你所看过的C编程的书籍,并写简要书评。(5分)

 对C的评价。如果要你改造一把菜刀,使之更加安全,你是否会使用这样的菜刀,为什么

 ?(5分)

 一.3、分析题。

 本题(各5分)。假设下面代码中的变量都是合法变量,调用外部的函数都是正确的。回答

 几个问题:

 这些代码意图要干什么?

 是否有问题?

 如果有问题,该如何修改,或者如何避免类似错误发生?

 如果没有问题,如果代码有输出,输出是什么?

 1、-----------------------------------------------------------

 int isvowel (char c)

 {

 return c=='a'||c=='e'||c=='i'||c=='o'||c=='u';

 }

 2、-----------------------------------------------------------

 while (c=='\'||c=' '||c=='\\n')

 c=getc(f);

 3、-----------------------------------------------------------

 /* 当x=2, y=3, z=? */

 if (x==0)

 if (y==0)

 z=-1;

 else

 z=x+y;

 4、-----------------------------------------------------------

 /* 处理网络事件 */

 void process_network_code(int x, int y)

 {

 /* 选择modes_pointer资源 */

 switch (line) {

 case THING1:

 /* 处理异常1#, 使用老的modes_pointer资源 */

 doit1();

 break;

 case THING2:

 /* 处理异常2#, 需要重新启动服务 */

 if (x == STUFF) {

 /* 重新申请modes_pointer资源,没有初始化 */

 do_first_stuff();

 /* 在这种条件下,有些资源不用重新申请 */

 if (y == OTHER_STUFF)

 break;

 /* 申请剩下的资源,并初始化 */

 do_later_stuff();

 }

 /* 初始化modes_pointer资源 */

 initialize_modes_pointer();

 break;

 default:

 /* 处理普通事件, 使用老的modes_pointer资源 */

 processing();

 }

 /* 使用modes_pointer资源,处理事件 */

 use_modes_pointer();

 }

 5、-----------------------------------------------------------

 int is_gb2312_char(char c1, char c2)

 {

if (c1 >= 0xa1 && c2 >= 0xa1)

 return 1;

 else

 return 0;

 }

 6、-----------------------------------------------------------

 下面x, y的值是多少,有什么问题?

 int x = 10, y = 3;

 x ^= y;

 y ^= x;

 x ^= y;

 /* x=?, y = ? */

 7、-----------------------------------------------------------

 int days[]={31,28,31,30,31,30,31,31,30,31,30,31,};

 int calendar[12][31];

 int (*monthp)[31];

 int *dayp;

 int i;

 memset(calendar, 0, sizeof(calendar));

 i = 0;

for (monthp = calendar; monthp < &calendar[12]; monthp++) {

for (dayp = *monthp; dayp < &(*monthp)[31]; dayp++) {

if (dayp - *monthp < days[calendar - monthp]) {

 *dayp = i++ % 7 + 1;

 }

 }

 }

 8、-----------------------------------------------------------

 void printnum(long n)

 {

if (n < 0) {

 putchar('-');

 n = -n;

 }

if (n >= 10) {

 printnum(n/10);

 }

 putchar ("01234567"[n%10]);

 }

 9、-----------------------------------------------------------

 void * memchr(void *pv, unsigned char ch, size_t size)

 {

 unsigned char *pch = (unsigned char *) pv;

 unsigned char *pchEnd = pch + size;

while (pch < pchEnd) {

 if (*pch == ch)

 return (pch);

 pch++;

 }

 return NULL;

 }

 10、-----------------------------------------------------------

 void * memchr(void *pv, unsigned char ch, size_t size)

 {

 unsigned char *pch = (unsigned char *) pv;

 unsigned char *pchPlant = pch + size;

 unsigned char chSave = *pchPlant;

 *pchPlant = ch;

 while (pch != ch) {

 pch++;

 }

 *pchPlant = chSave;

 return ((pch == pchPlant) ? NULL : pch);

 }

 11、-----------------------------------------------------------

 void UnsToStr(unsigned short int u, char *str)

 {

 char *pch;

assert(u <= 65535);

 pch = &str[5];

 *pch = '\\0';

 do {

 *--pch = u % 10 + '0';

} while ((u / 10) > 0);

 strcpy(str, pch);

 }

 12、-----------------------------------------------------------

 void *memmove(void *pvTo, void pvFrom, size_t size)

 {

 char *pbTo = (char *)pvTo;

 char *pbFrom = (char *)pvFrom;

((pbTo < pbFrom) ? tailmove : headmove) (pbTo, pbFrom, size);

 return (pvTo);

 }

 13、-----------------------------------------------------------

 void *memcpy(void *pvTo, void pvFrom, size_t size)

 {

 char *pbTo = (char *)pvTo;

 char *pbFrom = (char *)pvFrom;

while (size-- > 0);

 *pbTo++ = *pbFrom++;

 return (pvTo);

 }

 14、-----------------------------------------------------------

#include

 int main(int argc, char *argv[])

 {

 char s[]="01234567";

 int i = 0;

 do {

 printf ("%c", i++[s]);

 } while(s?1:printf("\\n")-1);

 return 0;

 }

 15、-----------------------------------------------------------

 int fibonacci(int x)

 {

 if (x == 1 || x == 2)

 return 1;

 return fibonacci(x - 2) + fibonacci(x - 1);

 }

 16、-----------------------------------------------------------

 这里有一个程序cdecl.c。写出它的工作流程。写出它的使用方法。

 给出一个典型输入用例,记录下它的输出。

 一.4、综合编程题。

 要求:

 1、完成需求,程序运行正确。

 2、工作原理文档,使用文档完整。

 3、代码规整优美。注释得当。

 4、运行速度足够快。

 5、用工具分析出是哪些代码或函数造成速度瓶颈。

 1、-----------------------------------------------------------

 编写一个排序程序。被排序的文件有8MB大小,一行一个随机整数(ASCII格式)。要求对

 这些整数进行

 排序,并计算平均值,打印出排序所需的时间。(20分)

 2、-----------------------------------------------------------

 用dummy header技巧实现一个链表DEMO。要求具有create, insert, delete, search功

 能。

 编写一个应用程序,使用上面的函数。使用dummy header技巧有什么优点。(20分)

 3、-----------------------------------------------------------

 用heapsort算法实现优先队列。要求具有create, insert, delete功能。

 编写一个应用程序,使用上面的函数。使用heapsort算法有什么优点。(20分)

 用trie(一种多叉树)实现一个字典。要求具有create, insert, delete, search功能。

 编写一个应用程序,使用上面的函数。使用trie树有什么优点。(20分)

 二、POSIX方面的知识。

 二.1、简答题。下面的题目必须全部答对才给分:(5分)

 1、在UNIX环境中,编译流程是什么?

 2、ABI,ELF的英文全称是什么

 3、一般UNIX的程序有多少段,举一个实际的例子说明。

 4、如何在kernel二进制代码中找一个字符串。

 5、段地址F000:FFF0转换为线形地址的值是多少(16进制表达)。

 6、在一个UNIX文件系统中,文件的唯一性标志是什么?

 二.2、问答题。

 1、-----------------------------------------------------------

 写一些代码。如何用文件实现信号灯?要求如果程序崩溃了,这个文件也将自动被删除

 。

 为什么可以这样实现信号灯?(5分)

 传统的signal函数信号处理为什么是不可靠的,信号和系统调用有何关系?(5分)

 在图形库系统中往往提供timer的功能,除了使用ALARM信号外,你还可以使用什么系统

 调用来实现timer?(5分)

 2、-----------------------------------------------------------

 写一些代码,演示如何正确使用write系统调用。注意看好手册再回答。(2分)

 如果一个文件以rw模式打开,在进行read/write操作转换时,需要进行什么操作。(2分)

 3、-----------------------------------------------------------

 解释终端结构termios.c_cc的MIN/TIME数值变化的带来read/write的特性。(5分)

 如何理解终端、控制终端、虚拟终端、控制台、tty等类同的概念?(5分)

 4、-----------------------------------------------------------

 解释计算机中Copy-On-Write的概念。(2分)

 调用fork之后,子进程没有继承父进程的属性有哪些?(5分)

 解释为什么每个程序在装入执行之后,总是已经预先打开了stdout、stdin、stderr?(2

 分)

 在fork之前,父进程打开了一个文件。在fork之后,如果子进程移动了文件指针,

 父进程的文件指针有什么变化;如果子进程关闭了文件,父进程有什么变化?为什么会

 这样?(5分)

 标准输入、输出和错误输出分别是什么类型的缓冲,这些缓冲在用户空间还是在核心空

 间?

 怎样关闭他们的缓冲?如果父进程关闭了缓冲,在fork之后建立的子进程是否也关闭了

 缓冲?(5分)

 vfork和fork相比,有什么特色?(2分)

 system函数是否等同于fork+exec?(2分)

 wait系统调用有多少种条件可以退出?(2分)

 5、-----------------------------------------------------------

 系统调用和库函数调用有什么区别。(2分)

 在linux2.4.x上的glibc和newlib(一种嵌入式C库)的系统调用有什么不同?(2分)

 在linux2.4.x上,对系统调用execve如果调用成功,它返回的值是多少。(2分)

 6、-----------------------------------------------------------

 列出你所知道的2个内存跟踪库。(2分)

 设计一个内存跟踪方案,为什么选择这个方案(5分)

 二.3、综合编程题。

 要求:

 1、完成需求,程序运行正确。

 2、工作原理文档,使用文档完整。

 3、代码规整优美。注释得当。

 4、运行速度足够快。

 1、-----------------------------------------------------------

 这里有一个8MB的文件,编写一个copy程序,拷贝这个文件,并计算所需时间。用工具分

 析

 出是哪些代码或函数造成速度瓶颈。

 提示:如果只是使用read/write调用,不是一个好的实现。(20分)

 2、-----------------------------------------------------------

 Linux系统中,什么时候会出现类似Y2K的问题。写一个程序证明。(20分)

 3、-----------------------------------------------------------

 编写一个程序,测试系统最小的睡眠时间间隔。(20分)

 4、-----------------------------------------------------------

 编写一个pipe程序,测试有N个管道,size大小的buffer情况下,pipe的传输性能是多少

 ?(20分)

 5、-----------------------------------------------------------

 在ext2文件系统上,单个文件最大可以达到多少?

 写一个程序获得这方面的。(20分)

 三、Linux编程基本使用知识。

 三.1、命令和shell

 1)编写一个脚本,统计一个目录下面所有C代码的行数。(2分)

 2)编写一个sed脚本,去除HTML文件中的HTML标记。(2分)

 3)编写一个脚本获得当前系统eth0的IP地址。(2分)

 4)编写一个脚本以交互的方式,进行DNS的设定。(2分)

 5)使用ls命令编写一个脚本,实现ls -R,递归列出当前目录下的所有目录、文件。(2

 分)

 6)-----------------------------------------------------------

 在一个目录下,找soft-link files,用下面的命令,原理是可行的,但无法操作,

 该如何解决?要2种方法。(2分)

ls -l | grep ->

 7)-----------------------------------------------------------

 如何把标准错误输出,重定向到标准输出上。(2分)

 8)-----------------------------------------------------------

 我们的系统中的软件包是使用RPM管理的。要求下面的问题写出shell命令和运行结果。(

 5分)

 如何知道系统中安装了几个软件包。

 如何知道系统中安装了哪几类(group)软件包。

 如何知道kernel软件包的简述。

 如何知道kernel软件包的Changelog。

 如何知道kernel软件包有几个文件。

 如何知道kernel软件包安装后有多大。

 三.2、编辑工具的使用。(各2分)

 1)如何使用vi进行块拷贝、粘贴、删除的操作

 2)如何设置Tab的长度,以及自动缩进的长度

 3)如何使用tag进行代码阅读

 4)如何在1~10行,有确认的进把所有的RedHat改为RedFlag

 5)在SourceNavigator中,如何跳到一个变量的声明处?如何得知光标当前的位置在那

 个函数体内?

 三.3、编译器与调试器。(各2分)

 1)如何使用gcc得到宏展开的中间代码

 2)如何通过gcc在命令行中传入宏定义

 3)在那一级优化的情况下,内联函数才真正的内联到代码中

 4)gdb的watch命令如何使用,有何缺点

 5)gdb中使用什么命令可以显式调用的栈帧,如何查看某个栈帧上的局部变量

 6)如何使用gdb调试多进程

 7)如何使能/禁止core dump?

 三.4、库。(各2分)

 1)如何知道XSetIMValues这个符号在那个X的库文件中

 2)如何读取C++的符号名,更具可读性

 3)请解释动态库的soname概念

 4)解释在链接时rpath选项的含义

 三.5、Makefile。(10分)

 如果有一个简单的Test项目目录如下:

 # tree Test

 Test

 |-- common.h

 |-- main.cpp

 |-- test.cpp

 `-- test.h

 1)使用wildcard、patsubst函数编写一个C++项目的Makefile文件

 2)使用automake、autoconfig编写一个支持configure选项的configure.in脚本

 三.6、CVS。(10分)

 1)如果一个CVS项目中,甲添加了一个子目录模块,那么乙在update时是否会自动检

 出这个新添加的子模块?如果不能,那么你有什么好的解决方案?

 2)如何在一个CVS项目中添加一个二进制文件,这个二进制文件可以进行增量的版本管

 理吗?

 3)如何检出标记(tag)为milestone-1的版本,如何创建以milestone-1为基础的分支

 milestone-1-b1,并如何把分支的修改合并到milestone-1的主分支上

 三.7、Linux/GNU编程基本知识

 1、-----------------------------------------------------------

 Linux2.4.x有多少种类型的设备文件?分别写出来。(2分)

 2、-----------------------------------------------------------

 glibc动态库的搜寻次序是什么?(2分)

 glibc 2.1.x 与 2.2.x的动态库的搜寻次序有什么不同?为什么会采用现在的方案?(2

 分)

 三.3、综合编程题。

 要求:

 1、完成需求,程序运行正确。

 2、工作原理文档,使用文档完整。

 3、代码规整优美。注释得当。

 4、运行速度足够快。

 1、-----------------------------------------------------------

 本题(20分)。写一个程序,有三个功能:

 a)取得CMOS中的当前时间,按照YY:MMD:HH:MM:SS格式输出。

 b)取得物理内存的大小,格式化输出。

 c)取得从物理段地址F000:FFF0起,16个字节的值,每字节按照16进制格式输出。

 2、-----------------------------------------------------------

 本题(20分)。对串口编程,编写一对类似ping的程序,作用在串口上,了解serial的联

 通情况。

 定义协议

 要求:

 定义一个联通和响应协议。至少具有:发送、回复、超时三种状态。除超时状态外,所

 有

 状态的数据必须经过校验才可使用。

 ping_serial_client

 要求:

 1,发送数据包;

 2,等待回复数据包,直到超时;

 3,如果有回复数据包,对数据包进行校验;

 4,计算校验通过的数据包之间的时间差;

 5,重复直到用户退出;

 6,统计丢包率,时间。

 界面:

 bash# ping_serial_client /dev/ttyS0 baud_value

 bytes from ttyS0, time=ms

 ......

 ^C

 --- ttyS0 ping statistics ---

  packets transmitted,  received, % loss

 time ms, min/avg/max = // ms

 ping_serial_server

 要求:

 1,等待对方的发送数据包;

 2,对发送数据包进行校验;

 3,校验通过则回复数据包;

 4,重复直到用户退出;

 界面:

 bash# ping_serial_server /dev/ttyS0 baud_value

 3、-----------------------------------------------------------

 编写一对socket程序,要求类似于network echo procotol。

 Client每隔1秒把自己的IP地址轮流循环发送给一个Server.

 Server接到IP后,在屏幕上打印对方IP;然后把自己的IP发送回去。

 Client收到回复后,在屏幕上打印对方IP。

 程序一直运行,直到用户退出。各自分类统计接收到的各IP的数据包的个数。

 注意:Client可以向多个Server发送请求,Server也可以接收多个Client请求。

 注意:输出信息的美观,和对错误的处理。

 -----------------------------------------------------------

 四、C++题目。

 -----------------------------------------------------------

 1。给定下面的代码:

 class Graph{

 public:

 Graph() { s_gCount++; }

 virtual ~Graph() { s_gCount--;}

 virtual int drawOut() = 0;

 static int getTotalCount() { return s_gCount; }

 protected:

 int m_x;

 int m_y;

 static int s_gCount;

 };下载本文

显示全文
专题