一、选择
- 凡在函数中未指明存储类型的变量,其隐含的存储类别为:auto
- 如下对static的描述,错误的是:
A. static修饰全局变量时,存储空间可能发生变化
B. static修饰全局变量时,作用域发生变化
C. static修饰局部变量时,作用域不会发生变化
D. static修饰局部变量时,存储空间发生变化
- 已知当前intel X86处理器属于小端字节序,在该平台上有一段代码如下:
unsigned short ausSrc[2] = {255, 254};
unsigned char aucDest[sizeof(ausSrc)];
memcpy(aucDest, ausSrc, sizeof(ausSrc));
已知sizeof(unsigned short) = 2,则aucDest[0]、aucDest[1]、aucDest[2]、aucDest[3]的数值是:255 0 254 0
- 对如下程序的正确评论为:D
void main(){
int a;
while(a=1) printf("%d
", a++);
}
A. 变量A没有初始化,取得1的概率极低,所以printf语句通常不会被执行
B. while语句只被执行一次
C. 程序输出2
D. 程序为死循环
- 以下程序执行后的sum值是:15
void main() {
int i, sum;
for(i=0; i<6; i++) {
sum += i;
}
printf("%d
", sum);
}
- 有如下宏定义
#define MULTI(A, B) A*B
执行unsigned int ulRet = MULTI(1+3, 6),则ulRet = 19
- 下面程序输出:6 -6 0 1
int main () {
int a=5, b=-7, c=0, d;
d = ++a && ++b || ++c;
printf("%d %d %d %d
", a, b, c, d);
return 0;
}
&&的优先级高于||,所以原式等价为d =(++a && ++b) || ++c;如果&&前为假,则将不会计算后面的式子,如果||前为假,则将继续计算后面的内容。反过来也一样。
二、填空
-
用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数: int *a[10](int)
-
下列代码输出的内容为:10 10
#include <stdio.h>
int main () {
int i=0, j=0;
while(i<5, j<10) {
i++;
j++;
}
printf("%d %d
", i, j);
}
- 计算机系统中,一般使用补码存储数据,使用16bit存储时,-5的二进制表示为:0XFD
十进制5可以用8位二进制表示为0000 0101,取反+1为补码1111 1011。
- UART在确定的波特率下有特定的协议,比如:
三、简答
- 请说明C语言的堆、栈、全局数据区的特性和他们各自存放哪些种类的变量。
答:
c中的几个存储区:
- 栈由编译器自动分配释放。在函数体中定义的变量通常是在栈上。
- 堆一般由程序员分配,若程序员不释放,程序结束时可能由操作系统自动回收。用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。
- 全局数据区的全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束释放。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区)。
- 还有一个专门放常量的地方,程序结束释放。函数中的 “adgfdf “这样的字符串存放在常量区。
- 试简述常见并行处理器技术及其特点。
答:并行处理器指可以一次可处理多个运算的处理器。但其本质上还是串行处理器的组合,所以提起并行处理器,一般指经特殊设计的多线程处理器。
流水处理这可以大大提高处理速度,是并行系统必须具有的特点之一。
四、编程
如下C函数用来删除一个单向链表中的所有节点,请实现其功能:
struct Node {
struct Node *next;
int i;
}
int delete_all(struct Node *head) {
struct Node p, q;
p = head->next;
while(p != 0) {
q = p->next;
free(p);
p = q;
}
head->next == NULL;
return 0;
}