嵌入式软件工程师面试遇到的经典题目_int ptr; ptr= (int )0x67a9; ptr = 0xaa55;(1)

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

1、找错误

char \* s1="hello";
char \* s2="world";
char \* s3=strcat(s1,s2);

这样做对吗,如果不对请说明原因。

解答:
不对,s1与s2都为常量指针,其内容不可修改,运行就会产生段错误。

下面的代码有何问题?

void test1()
{
 char string[10];
 char\* str1 = "0123456789";
 strcpy( string, str1 );
} 


字符串strl的末尾是以’ \0 ’结尾的,所以他的长度是11,而string的长度不够。。。。

但是我自己写了这样的程序,他是可以拷贝的。。。。

2、下面的代码输出是什么,为什么?

void foo(void)
{
	unsigned int a=6;
	int b=-20;
	(a+b>6)?puts(">6"):puts("<6")
}

输出“>6”,应为无符号数和有符号相加,有符号的整形数会转化成一个无符号的整型数,而且负的有符号整型数转换后会变得非常大,所以相加会大于6。

3、C语言编译时动态链接和静态链接得区别是什么?

动态库:
1、链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
2、程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
3、. 加载速度比静态库慢
4、发布程序需要提供依赖的动态库

静态库:
1、静态库被打包到程序中加载速度快
2 、发布程序无需提供静态库,应为已经在app中,移植方便
3 、 链接时完整的拷贝至可执行文件中,被多次使用就会有多次冗余拷贝
4、 更新,部署,发布麻烦

4、C语言关键字static得作用是什么?

①隐藏作用, 可以在不同的文件中定义同名变量和同名函数。
②对于变量来说, 保持变量持久, 静态数据区的变量会在程序刚刚运行时就完成
初始化, 也是唯一一次初始化; 储存在静态数据区, 静态存储区只有两种变量(全
局变量和 static 静态变量) 。
③默认初始化为 0x00,和全局变量一样的属性, 减少程序员的工作量。

5、分别说明一下三个变量声明得含义:

 int const \*p;

int \* const p;

int const \*p const;

int const*p=const int *p; const修饰的是指针 p,表示指针p的值不能改变,而p(即地址)是可以改变的;

int * const p; const修饰的是p(即地址)是常量,不可改变,但是*p的值可以改变。

int const *p const ; 上面两种情况兼得,表示只读,其地址以及地址中的值都不可改变

6、简述TCP/IP镞包含哪些分段,每一层有哪些常用协议?

应用层:http dns telnet ftp TFTP 。。。。
传输层:tcp udp
网络层:ip ICMP ARP rarp
数据链路层:ethnet ethnet2 802.3 ppp fr x.25 hdlc
物理层:比特流

7、从在浏览器地址栏中输入www.baidu.com到看到百度首页,这个过程中间经历了什么?都涉及到哪些网络协议?

按照时间顺序:
1.客户端浏览器获取用户在地址栏输入的域名。
2.客户端浏览器将域名发送给DNS域名系统,请求解析。
3.DNS解析域名得到相应的IP,返回给客户端浏览器。
4.客户端浏览器根据IP向服务器发起TCP三次握手,建立TCP连接。
5.客户端浏览器向服务器发送HTTP请求,请求百度首页。
6.服务器通过HTTP响应向客户端浏览器返回百度首页文件。
7.释放TCP连接。
8.客户端浏览器解析HTML文件,根据文件内容获取CSS、JS等资源文件,将页面渲染展示给用户。

TCP/IP五层模型中网络层及以上用到的协议:
1.应用层:HTTP、DNS、HTTPS
2.传输层:TCP、UDP
3.网络层:IP、ARP

8、编写strcat函数

2.strcat函数原型

char \*my\_strcat(char \*dest,const char \*src) //将源字符串加const,表明其为输入参数
{
  char \*strDest=dest;
  assert(dest!=NULL && src!=NULL);      //对源地址和目的地址加非0断言
  //若使用while(\*Dest++),则会出错,指向'\0'之后,会出现dest++,则指向了个'\0'的下一个位置,
  while(\*dest !='\0')
  {
    dest++;                                            //循环体内的++可以使指向字符串结束标志'\0'
  }
  while((\*dest++=\*src++)!='\0');
  return strDest; 
}

之后会问为什么要char *的返回值:
主要是为了实现链式表达式。
如 strcpy(buf, strcat(dest, src) );

9、使用C语言中的#define来定义一个常量来表示一年有多少秒?

#define SECONDS_PER_YEAR (606024*365)UL

一定要加括号,宏定义只是替换,不加括号会出错。。。。

10、实现把字符串转化成整数

int my\_atoi(char \*str)
{
	int sum=0,status=1;
	if(str == NULL)
	{
		return 0;
	}
	if(\*str == '-')
	{
		status = -1;
		str++;
	}
	while((\*str)!='\0')
	{
		sum=sum\*10+ ((\*str)-'0');
		str++;
	}
	return sum\*status;
	
}


11、写一个程序验证系统的大小端存储格式

/\*方法1\*/
typedef union {
	int i;
	char c;
}my_union;
 
int checkSystem1(void)
{
	my_union u;
	u.i = 1;
	return (u.i == u.c);
}
/\*方法2\*/
int checkSystem2(void)
{
	int i = 0x12345678;
	char \*c = &i;
	return ((c[0] == 0x78) && (c[1] == 0x56) && (c[2] == 0x34) && (c[3] == 0x12));
}


12、如何判断一个byte数据中有多少bit为1?

int select(unsigned char data)
{
	int count=0,i=1;
	while(data!=0)
	{
		count +=  (data & i);
		data >>= 1;
	}
	return count;	
}


13、 C语言中关键字volatile的含义

volatile 的意思是“易失的,易改变的”。这个限定词的含义是向编译器指明变量的内容可能会由于其他程序的修改而变化。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

一个参数既可以是const还可以是volatile吗?解释为什么。
是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

14、进程间通信的方式有哪些?

1.无名管道( pipe ): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

2.有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

3.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

4.信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

5.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

6.共享内存( shared memory ) : 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

7.套接字( socket ) : 套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

的进程通信。

[外链图片转存中…(img-B4JBc5WR-1715549326400)]
[外链图片转存中…(img-oALbbjt7-1715549326400)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值