嵌入式软件工程师笔试题(一)

1. 头文件 ifndef /define /endif的作用。
防止该头文件被重复引用。

2. 定义一个宏实现max,找出a,b中的最大值
#define max(a,b)( (a)<(b)?(a):(b))

3.1 某32位系统下, C++程序,请计算sizeof 的值

void main
 {    
 	char str[] = "xmgcc";    
 	void *p = malloc(100);    
 	char *p2 = "str";    
 	int n = 10;    
 	sizeof(str) =  
 	sizeof(p) =    
 	sizeof(n) =    
 	sizeof(p2) = 
} 
void Foo(char str[100]) 
{    
	sizeof(str) = 
}

sizeof(str) = 6; 数组——编译时分配的数组空间大小,不要忘记/0。5+1=6。
sizeof§ = 4;指针——存储该指针所用的空间大小(存储该指针的地址的长度,一般为4);
sizeof(n) = 4;类型——该类型所占的空间大小;
sizeof(p2) =4;
sizeof(str)=4;当数组作为参数时,数组就退化成了指针。

3.1 某64位系统下, C++程序,请计算sizeof 的值

void main
 {    
 	char str[] = "xmgcc";    
 	void *p = malloc(100);    
 	char *p2 = "str";    
 	int n = 10;    
 	sizeof(str) =  
 	sizeof(p) =    
 	sizeof(n) =    
 	sizeof(p2) = 
} 
void Foo(char str[100]) 
{    
	sizeof(str) = 
}

只要是指针,在32位系统中所占的字节数就是4,在64位系统中所占的字节数是8.

sizeof(str) = 6; 数组——编译时分配的数组空间大小,不要忘记/0。5+1=6。
sizeof§ = 8;指针——存储该指针所用的空间大小(存储该指针的地址的长度,一般为4);
sizeof(n) = 4;类型——该类型所占的空间大小;
sizeof(p2) =8;
sizeof(str)=8;当数组作为参数时,数组就退化成了指针。

4. #include <file.h>和#include "file.h"的区别
#include <file.h>
编译器在编译时候会默认从 /user / include / 文件夹下面去找头文件。
include “file.h”
编译器在编译时候会当前文件夹下面去找头文件。

5.打印输出内容,如果代码存在问题,请解释

void GetMemory(char **p, int num) 
{    
	*p = (char *)malloc(num); 
}
void Test1() 
{    
	char *str = NULL;    
	GetMemory(&str, 100);    
	strcpy(str, "xmgcc");    
	printf("%s\n", str); 
}
void Test11() 
{    
	char *str = NULL;    
	GetMemory(str, 100);    
	strcpy(str, "xmgcc");    
	printf("%s\n", str); }
//
char* GetMemory2() 
{    
	char p[] = "xmgcc";    return p; 
}
void Test2() 
{    
	char *str = NULL;    
	str = GetMemory2();    
	printf("%s\n", str); }
//
char *GetMemory3() 
{    
	char *p = malloc(100);    
	return p; 
}
void Test3() 
{    
	char *str = NULL;    
	str = GetMemory3();    
	strcpy(str, "xmgcc");    
	printf("%s\n", str); 
}
//
char* GetMemory4() 
{    
	char p[100];    
	return p; 
}
void Test4() 
{    
	char *str = NULL;    
	str = GetMemory4();    
	strcpy(str, "xmgcc");    
	printf("%s\n", str);
}
//
void Test5() 
{    
	char *str = (char *)malloc(100);
	strcpy(str, "xmgcc");    
	free(str);
	if (str != NULL) {        
		strcpy(str, "welcome");    
	}    
	printf("%s\n", str); 
}
void GetMemory6(char *p) 
{   
	p = (char *)malloc(100);    
	strcpy(p, "xmgcc"); 
}
void Test6() 
{    
	char *str = NULL;    
	GetMemory6(str);    
	printf("%s\n", str);    
	**free(str); 
}

6. malloc和new的区别
相同点:都用于动态申请内存
不同点:
malloc是系统库函数,new是C++运算符
malloc需要指定申请的内存大小,new则不需要
new创建类的时候,会自动调用构造函数,而melloc则不需要

7. 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明
C++为了支持函数重载,函数在C++编译后的名字与Cu语言中不同。
extern “C”是告诉编译器一C语言的方式进行编译和链接。
8.编写strcpy函数

char *strcpy(char *dst,char*src)
{
	if(dst == NULL || scr == NULL)
	return NULL;
	char *p = dst;
	while((*dst++ = *src++) != /0)
	return p;
}

9. 多线程为什么要加锁
加锁是为了保护共享资源,如全局变量等共享资源,如果不加锁,第一个线程在使用该全局变量的时候,第二个线程也要修改该变量,会造成冲突。

10. 什么是死锁,如何避免死锁
死锁就是线程一直获取不到锁,第一个线程获取锁,用完锁之后,并没有释放锁,导致第二个线程获取不到锁,处于阻塞状态,导致死锁。
用完锁之后释放锁就可以避免死锁。

11. linux程序创建共享内存,程序运行结束后,共享内存是否还存在
不销毁的话,共享内存会一直存在。

12. 请填写bool flag, float x, 指针变量p 与“零值”比较的if
bool flag比较
if(flag);
if(!flag);

float x 比较
conest float EPSINON = 0.00001;
if(x>= - EPSINON) &&(x<= EPSINON);

指针
if(p == NULL);
if(p != NULL);

13. 以下代码产生什么结果,为什么

char str[5];
strcpy(str, "0123456789")

程序会崩溃,str的大小是5 存放不下0123456789

14. 以下代码的输出结果

void Test7() {    
	char str1[10] = {0};    
	char str2[10] = "abcd";
	printf("%d\n", strlen(str1));   0    
	printf("%d\n", sizeof(str1));   10
	printf("%d\n", strlen(str2));    4    
	printf("%d\n", sizeof(str2));    10 
}

strlen 是实际用多少就分配多少空间
sizeof 是标多少空间就分多少空间

15. 关键字volatile有什么含意,在哪些情况下使用
该语句不希望因为编译器的优化而被忽略掉,且要求每次直接读值

①并行设备中的硬件寄存器,如状态寄存器
②中断程序中的子程序会访问到的非自动变量
③线程中被多个任务共享的变量

16. const有什么作用
定义const常量,使其具有不可变性;

17. 已知一个数组array ,用一个宏定义ARRAY_SIZE ,求出数组的元素个数
#define ARRAR_SIZE(arry) (sizeof(arry)/sizeof(arry[0])

18. 栈和堆的区别,哪些变量保存在栈,哪些变量保存在堆。
栈:由系统分配内存空间,向低地址扩展,先进后出,如局部变量,
堆:由开发人员申请 释放,向高地址扩展,先进后出,

19. 以下程序的输出内容

int Calc() {    
	static int i = 0;   
	 i++;    
	 return i; 
 }
void Test8() {    
	Calc();    
	printf("%d\n", Calc());  2 
}

static把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量 后是改变了它的作用域, 限制了它的使用范围。
在执行第一次 i的值被改为1 由于static原因 i = 1 仍然存在
在执行第二次 i的值被改为1+1 = 2 由于static原因 i = 2一直存在

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值