嵌入式经典面试题3
1、观察以下代码,结果会输出什么?
int main()
{
int num1 = 4;
int num2 = 5;
if(num1 = 4) num2++;
if(num2 = 9) num2++;
printf("%d\n",num2);
return 0;
}
参考答案:10
分析:注意判断条件是赋值号 “=”,而不是判等号 “==”
2、C语言源代码中,死循环的有几种写法?
参考答案:
有4种常见的写法:
(1)while(1) { }
(2)do{ }while(1);
(3)for(;;){ }
(4)for(;1;){
3、单片机开发中,C程序的编译步骤有哪些阶段?每一阶段都做了什么?
参考答案:
C程序的编译步骤有4步。
(1)预处理阶段,
该阶段进行宏定义的文本替换、头文件展开、条件编译、删除注释
该阶段会将将.c文件转成预处理文件,一般是.i文件,即:xx.c---->xx.i文件
注意:该阶段不会进行语法检测,所以语法报错不会出现在该阶段,这是面试题中容易踩的坑
(2)编译阶段
该阶段会进行有发检测、代码优化
该阶段会将预处理文件,编译生成汇编文件,一般是.s文件。即:xx.i---->xx.s文件
注意:语法报错发生在这一阶段
(3)汇编阶段
该阶段主要将汇编文件翻译生成机器码(二进制文件或者是目标文件),一般是.o或者.out
文件 即:xx.s---->ss.o/xx.out
(4)链接生成可执行文件
该阶段,将多个目标文件和库文件合并,最终生成一个可执行文件,
一般是.hex或者.bin文件
即:多个.o文件合并成一个.hex文件,用于单片机程序的烧录
4、define宏常量和const常量有什么区别?
参考答案:
首先,两个关键字都可以定义常量,值都不可以改变,其次区别如下:
1、define宏常量 定义常量的原理是,预处理阶段进行字符串的替换,不会分配内存,也没有类型保护,一般定义在函数体的外部,作用域是整个程序(即所有的.c文件)
2、const常量 定义常量的原理是,限制了变量的权限为“只读”权限,定义时需要分配内存,有类型保护,一般定义在函数体的外部,作用域是当前函数体内部。
5、观察下面代码,会输出什么内容?为什么?
#include <stdio.h>
#include <string.h>
int main()
{
char arr[10];
printf("%d\n", strlen(arr));
printf("%d\n", sizeof(arr));
printf("%d\n", arr[0]);
return 0;
}
参考答案: 随机值 10 随机值
分析:
(1)strlen() 与数组是否初始化有关系,如果初始化,初始化的字符串的字符的个数
如果没有初始化,结果是随机值
(2)sizeof()与数组是否初始化没有关系,结果就是数组在计算机内存中所占的字节数,该题中应该是 10
(3)由于局部变量数组没有初始化,计算机会初始化为随机值,所以arr[0]也是随机值
6、在32位操作系中,运行以下代码,会输出什么?
#include <stdio.h>
#include <stdlib.h>
void fn1(char arr[50])
{
//......
printf("%d\n",sizeof(arr));
}
int main(){
char st[50];
fn1(st);
int *ptr = (int *)malloc(50);
printf("%d\n",sizeof(ptr));
return 0;
}
参考答案:
4 4
分析:
(1) 数组名作为参数进行传递,传递进去的是数组的首元素地址,是个指针,对于32位操作系统而言,指针就占4个字节
(2)str是一个指针,指向连续50个字节内存的首地址,指针在计算机内存中占4个字节
更多推荐
所有评论(0)