HYCX笔试
C语言和嵌入式软件 面试题(共10题 时间30分钟)
1. 请写出下面声明的含义。
- int(*s[10])(int);
定义了一个数组为s包含十个元素,每个元素都是函数指针,函数的参数为一个int类型,返回值也是int类型
2. 选择题
- 设有一台计算机,它有一条加法指令,每次可计算三个数的和。如果要计算79个数的和,至少要执行的加法指令次数为____。
A. 37 B. 38 C. 39 D. 40D
- 为了向二进制文件尾部增加数据,打开文件的方式应采用____。
A. “ab” B. “rb+” C. “wb” D. “wb+”ab:追加二进制 rb+:读写二进制 wb:只写二进制 wb+:读写二进制 所以选:A
- 执行语句“k=7>1;”后,变量k的当前值是____。
A. 15 B. 31 C. 3 D. 1D
- 设
则在考虑字节对齐和声明紧缩的不同情况下,sizeof(cs)的值分别是____和____。typedef struct { short a; char b; float c; } cs;
A. 4 B. 5 C. 6 D. 7 E. 8E,C
- 若定义了char ch[]={“abc\0def”},p=ch;则执行printf(“%c”,(p+4));语句的输出结果是____。
A. def B. d C. e D. 0B
3. 请写出下面一段程序的计算结果。
-
左侧代码:
int sum(int a) { int c = 2; static int b = 2; if (c == 2) a += 2; if (b != 6) b += 2; return (a + b + c); }
-
右侧代码:
#include <stdio.h> #include <string.h> void main() { int i; for (i = 0; i < 3; ++i) printf("%d ", sum(i)); printf("\n"); }
sum(0):8 sum(1):11 sum(2):12
4. 假设以数组seqn[m]存放循环队列的元素,设变量rear和quelen分别指示循环队列中队尾元素的位置和元素的个数。
- 写出队满的条件表达式。
- 写出队空的条件表达式。
- 设m = 40, rear = 13, quelen = 19,求队头元素的位置。
- 写出一般情况下队头元素位置的表达式。
1.rear==m-1
2.quelen==0
3.(rear+m-quelen+1)%m=(13+40-19+1)%40=35
4.(rear+m-quelen+1)%m
5. 用P表示入栈操作,D表示出栈操作,若元素入栈的顺序为1234,为了得到1342出栈顺序,相应的P和D的操作串为____。
PDPPDPDD
6. 用边界值分析法,假定10 < X < 30,那么X在测试中应取的边界值是____。
10.000001和10与29.999999和30
7. 两个正整数,它们可能相等也可能不相等。把它们的和告诉了甲,把它们的积告诉了乙。
- 乙说:“我不知这两个数是多少。”
- 甲说:“我不知这两个数是多少。”
- 乙说:“我现在知道了。”
问:这两个数是多少?
答案:1 1
8. 给你一个由陆地(“1”)和水(“0”)组成的二维网格,请编程计算网格中岛屿的数量。假设该网格的四条边均被水包围,而岛屿是被水包围的,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
- 示例1:
- 输入:
grid = [ ["1","1","0"], ["1","1","0"], ["0","0","0"] ]
- 输出:1
- 输入:
- 示例2:
- 输入:
grid = [ ["1","1","0","0","0"], ["1","1","0","0","0"], ["0","0","1","0","0"], ["0","0","0","1","1"] ]
- 输出:3
- 输入:
9. 在操作系统的虚拟内存管理中,内存地址由页目录号、页号和页内偏移3个部分组成。如果页目录号占10位、页号占10位、页内偏移占12位。请问:
- 一个页目录最多____页。
- 一个页面最多____页。
(1)2^10=1024
(2)2^12=4069=4kb
10. 用预处理指令#define声明宏NELEMENTS,求出数组array中的元素个数。
```c
#define NELEMENTS(array)
```
#define NELEMENTS(array) (sizeof(array)/sizeof(array[0]))
11. 简述大端(big endian)和小端(little endian)字节顺序的区别。
大端字节顺序:也称作大端序或大端法,数据的高位字节存于低地址,低位字节存于高地址。这就如同我们日常书写数字,从高位到低位依次排列。
小端字节顺序:又称小端序或小端法,与大端序相反,数据的低位字节存于低地址,高位字节存于高地址
12. 指出有关内存方面的编程错误,后果及改正方法。
- 左侧代码:
void GetMemory(char **p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
}
-
(1) 请指出编程错误。
-
(2) 请指出错误后果。
(1)printf()没有%s
(2)编译报错
- 右侧代码:
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
- (1) 请指出编程错误。
- (2) 请指出错误后果。
(1)返回了临时空间的地址
(2)可能输出乱码