嵌入式面试题(转)
来源:互联网 发布:海岛奇兵攻略软件 编辑:程序博客网 时间:2024/06/06 09:47
- 1. 输出什么?
- int a = (1,2);
- printf("a=%d\n",a);
- 答:a=2,逗号表达式的赋值
- 2. struct value {
- char a[3];
- short b;
- };
- struct value temp;
- printf("sizeof(temp) is %d\n", sizeof(temp));
- 答:sizeof(temp) is 6
- 3.编写程序交换a,b的值(使用二种方法)
- void swap(int *a, int *b)
- {
- int temp;
- temp = *a;
- *a = *b;
- *b = temp;
- }
-
- void swap(int *a, int *b)
- {
- *a = *a + *b;
- *b = *a - *b;
- *a = *a - *b;
- }
-
- 4. 说明int *p[5]和int(*p)[5]的区别
- 答:int *p[5]是指针数组,数组里存储的是指针
- (*p)[5]是数组指针,指向一个含有5个数的数组
- 5. 编写函数实现链表的创建,节点的插入和删除
- typedef struct node
- {
- int num;
- struct node *next;
- }Node;
-
- Node *create()
- {
- Node *p, *head;
- int n;
- head = (Node *)malloc(sizeof(Node));
- head->next = NULL;
- scanf("%d", &n);
-
- while(n > 0) {
- p = (Node *)malloc(sizeof(Node));
- p->num = n;
- p->next = head->next;
- head->next = p;
- scanf("%d", &n);
- }
-
- return head;
- }
-
- Node *insert(Node *head, int pos, int num)
- {
- Node *p, *pre;
- int i=1;
- pre = head;
- while(pre->next && i < pos)
- {
- pre = pre->next;
- i++;
- }
-
- p = (Node *)malloc(sizeof(Node));
- p->num = num;
- p->next = pre->next;
- pre->next = p;
-
- return head;
- }
-
- Node *delete(Node *head, int num)
- {
- Node *p, *pre;
- p = head->next;
-
- while(p->num != num) {
- pre = p;
- p = p->next;
- }
-
- if (p->num == num) {
- pre->next = p->next;
- free(p);
- }
-
- return head;
- }
-
- 6. 说明如下两片代码的区别
- char *p = "love linux";
- char p[] = "love linux";
- 答:*p中的p是一个指针,指向一片只读的字符串
- p[] 是一个数组,该数组被初始化
-
- 7.用C语言实现一相n!函数(要求用递归实现)
- long fact(int n)
- {
- if (n==0 || n==1) {
- return 1;
- }
- if(n > 1) {
- return n*fact(n-1);
- }
- }
-
- 8. char c;
- char b[20] = "I love Linux";
- c = 'I'与C=“I” 有什么区别,字符串b在内存占几个字节
- 答:c = 'I'是一个字符,c = "I" 是一个字符串,从对数组b的定义
- 可知,b在内存中占有20个字节(与它进行初始化的字符串长度无关)
- 9. 实现自己的mystrcat()函数
- char *mystrcat(char *dst, const char *src)
- {
- char *cp;
- cp = dst;
- while (*cp)
- cp ++;//指针指向字符串尾
- while(*cp++ = *src++);//每次循环最后一次拷贝了"\0"
- return dst;
- }
-
- 10. char str[20];
- scanf("%s", str);
- printf("%s", str);
- 如果输入I love linux回车,结果输出什么?为什么?
- 答:输出I,因为scanf输入字符串不能有空格
- 11. 已知两个整型数组均为升序排列,将两个数组合并,且合并后仍按升序排序
-
- //m为数组a的长度,n为数组b的长度,c是指向新开辟的数组
- void combin(int *a, int *b, int *c, int m, int n)
- {
- int *p1, *p2, *p3;
- for(p1 = a, p2 = b, p3 = c; p1 < a+m && p2 < b+n;)
- {
- if (*p1 < *p2)
- *p3++ = *p1++;
- else
- *p3++ = *p2++;
- }
-
- while(p1 < a+m) *p3++ = *p1++;
- while(p2 < b+n) *p3++ = *p2++;
-
- }
- 1.局部变量能否和全局变量重名?
- 答:能,局部会屏蔽全局
- 2.如何引用一个已经定义过的全局变量
- 答:extern
- 3.全局变量可不可以定义在可被多个.c文件包含的头文件中?
- 答:可以,在不同的c文件中以static形式来声明同名全局变量
- 4.语句for(; 1; )有什么问题?它是什么意思
- 答:死循环
- 5.程序中,全局变量、静态变量存在于(全局数据区)
- 局部变量存在于(堆栈中),动态申请数据存在于(堆)中
- 6.队列和栈有什么区别?
- 答:队列先进先出,栈后进先出
- 7.对于一个频繁使用的短小函数,在C语言中用什么实现,C++中呢?
- 答:C用宏定义,C++用inline
- 8.确定模块的功能和模块的接口是在软件设计的那个时期完成的
- 答:概要设计
- 9.引用和指针有什么区别?
- 答:1)引用必须被初始化,指针不必
- 2)引用初始化以后不能被改变,指针可以改变所指的对象
- 3)不存在指向空值的引用,存在指向空值的指针
- 10.RTOS的基本特性
- 答:实时性与可靠性
- 11.什么是平衡二叉树?
- 答:左右子树都是平衡二叉树,且左右子树的深度差的绝对值小于1
- 12.堆栈溢出一般是由什么原因导致的?
- 答:没有回收垃圾资源
- 13.构造函数不能声明为虚函数
- 14.Internet采用哪种网络协议?该协议主要层次结构?
- 答:TCP/IP,应用层、传输层、网络层、物理层(数据链路层)
- 15.Internet物理地址和IP地址转换采用什么协议?
- 答:ARP(地址解析协议)
- 16.请定义一个宏,比较两个数a,b的大小,不能使用大于,小于,if语句
- 答:#define MAX(a,b) (a/b) ? a:b
- 17.写一个病毒
- while(1)
- {
- int *p = new int[100000000];
- }
-
- 18.求一个字符串的长度,两种方法
-
- int mystrlen(char *s)
- {
- int len = 0;
- while(*s++)
- len++;
- return len;
- }
-
- int mystrlen(char *s)
- {
- char *str = s;
- while(*str)
- str++;
- return (str - s);
- }
-
- 19.字符串复制
- char *mystrcpy(char *dst, const char *src)
- {
- char *ret = dst;
- while(*ret++ = *src++);
- return dst;
- }
-
- 20.内存复制
- void *mymemcpy(void *_dst, const void *_src, unsigned len)
- {
- unsigned char *dst= _dst;
- const unsigned char *src = _src;
- while(len-- > 0)
- {
- *dst++ = *src++;
- }
- return _dst;
- }