2020海康威視嵌入式軟件工程師面試題目

//自己做的有不對的請留言
1.與C語言相比,彙編語言的可移植性(C)

  • 一樣
  • 不清楚
  • 較差
  • 較好

解析:
彙編是與當前硬件架構緊密相關的,比如你給x86 CPU寫的彙編是無法用在 ARM 上面的(指令、寄存器等全都不一樣)。即時是相同的架構,給32位CPU的彙編也無法用在16位的CPU上。彙編完全不具備可移植性。
C語言本身是硬件架構無關的,所以它是可以移植的。不同平臺下的C編譯器能將通用的C語言轉換成對應平臺(x86,arm,等等)下的彙編語言。(比如常用的編譯器gcc可以用 gcc -S a.c 就是將a.c轉換成對應的彙編a.s)

2.下面描述錯誤的是()

  • public成員集成爲類的接口
  • private成員可以在類外部訪問
  • 類成員由private,protected,public決定訪問特性
  • 所有成員都可以被外部訪問

*3.關於語句char ptr = malloc(0)以下描述錯誤的是(C)

  • 當返回具體內存值時,ptr佔用一定的內存空間
  • 可能返回一個具體的數值
  • 可能返回NULL
  • 當返回具體內存值時,ptr佔用內存空間不能被使用或者釋放

解析
當使用malloc後,只有在沒有足夠內存的情況下才會返回NULL ,或者異常報告
malloc(0),表示系統已經幫你準備好了堆棧中使用的起始地址只是不允許讀寫而已,
NULL 一般定義爲 (void *)0,指向0的地址,malloc是程序在堆棧中分配空間,不會是0地址
例如:
int pp =(strlen((ptr=(char *)malloc(0))0顯示錯誤
malloc(0)是指分配空間內存大小爲0
NULL是不指向任何實體
mallo(0)也是一種存在不是NULL

**4.假設char test[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};int test_p = (int )test 表達式 int a=test_p[1];以大端模式存儲在1000~1003H的內存地址上,則1000H上存儲的是(D)

  • 0x01
  • 0x02
  • 0x05
  • 0x08

5.32位系統中有如下結構體:
typedef struct{ int a; float b; char c[253]; double d; char f[35]; long int e; short g; short *ptr; int *ptr2; short h[33]; char *ptr3; }HKVISION; sizeof(HKVISION)? 怎麼優化??

400
優化
int a;
float b;
double b;
long int e;
char *ptr3;
short *ptr;
int *ptr2;
char c[253];
char f[35];
short h[33];
short g;

在這裏插入圖片描述

知識點
不同的地方在於指針 char * long 和 unsigned long

32位編譯器:

  char :1個字節
  char*(即指針變量): 4個字節(32位的尋址空間是2^32, 即32個bit,也就是4個字節。同理64位編譯器)
  short :2
  short int : 2個字節
  int:  4個字節
  unsigned int : 4個字節
  float:  4個字節
  double:   8個字節
  long:   4個字節
  long long:  8個字節
  unsigned long:  4個字節

64位編譯器:

  char :1個字節
  char*(即指針變量): 8個字節
  short int : 2個字節
  int:  4個字節
  unsigned int : 4個字節
  float:  4個字節
  double:   8個字節
  long:   8個字節
  long long:  8個字節
  unsigned long:  8個字節

5.Linux系統中線程什麼是不能共享的(C)

  • 全局變量
  • 文件句柄

考點
進程和線程的區別—背誦

6.二叉樹描述正確的是(D)

  • 二叉樹的深度不超過256
  • 滿二叉樹又叫做完全二叉樹
  • 二叉樹子樹沒有左右之分
  • 二叉樹每個節點最多兩個子樹

二叉樹知識點
https://blog.csdn.net/u013834525/article/details/80506126

7.TCP工作原理錯誤的是(D)

  • 應用數據被分割成TCP認爲最合適發送的數據塊
  • TCP提供流量控制
  • TCP保持他首部和數據校驗和,這是一個端到端的校驗
  • TCP報文段作爲IP數據報來傳送,而IP數據報到達可能會失序,因此TCP報文到達可能會失序這種情況應用層收到的也是失序的

8.MTU指定了網絡中可傳輸數據包的最大尺寸,常用在以太網中,MTU是幾個字節(A)

  • 1500
  • 隨機
  • 1024
  • 100

這裏要和IP 端口區分開來—65536
協議還可以改正
mss

9.32位的程序最大尋址空間是(C)

  • 2G
  • 1G
  • 4G
  • 8G

2^32=4G

10.cpu能夠執行的是(D)

  • 機器語言直接執行
  • 機器語言與彙編語言
  • 機器語言與彙編語言與硬件描述語言程序
  • 機器語言和硬件描述語言程序

11.一下那些方式可以實現Linux 系統下的進程間通信(ABC)

  • Socket
  • 管道
  • 信號
  • 全局變量

12.Head和Stack內存空間描述正確的是(CD)

  • c中的maloc空間分配是在stack中
  • 程序運行過程中函數調用時參數的傳遞在stack上進行
  • stack空間分配由操作系統自動進行分配
  • heap上的空間手動分配和釋放

13.下面關於中斷處理函數說法正確的是(AC)

  • 中斷處理函數沒有返回值
  • 中斷處理函數可以有返回值
  • 中斷處理函數沒有參數
  • 中斷處理函數可以有參數

14.下面描述正確的是(ABD)

  • 調用函數的時候,實參和形參類型可以不一致
  • 調用函數時,實參可以是表達式
  • 調用函數時,實參和形參可以共用內存單元
  • 調用函數時,程序會爲實參和形參分配內存空間

我感覺實參和形參可以一樣也可以不一樣
形參變量只有在被調用時才分配內存單元,在調用結束時,即可釋放所分配的內存單元。因而,形參只有在函數內部有效。函數調用結束後返回主調函數後則不能再使用該形參變量
實參可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值,以便把這些值傳送給形參。
因此應預先用賦值、輸入等辦法使實參獲得確定值。
函數調用中發生的數據傳送是單向的。 即 只能把實參的值傳送給形參,而不能把形參的值反向傳送給實參。因此 在函數調用過程中,形參的值發生改變,而實參中的值不會變化

15.已只一個數組table 請利用宏定義求出數組元素的個數
#define N (sizeof(table)/sizeof(table[0]))
16.進程和線程的區別

  • 進程是系統資源分配的最小的單位,線程是程序執行的最小單位
  • 進程有自己獨立的地址空間,每次啓動一個進程,系統都會爲他自動分配,數據段,代碼段,堆棧段,這種操作非常昂貴,而線程和進程共享相同資源僅僅擁有自己的局部變量(棧),共享全局變量和堆,文件句柄等,因此cpu 花銷線程明顯少於進程
  • 線程通信比進程方便得多,但是需要處理好同步和互斥,相同進程下需要用到IP C
  • 多進程不容易讓程序崩潰,而線程容易因爲一個線程掉線導致程序崩潰

**16.程序實現單鏈表節點Link的定義插入link *insertElem(link *p,int elem,int add),查詢 int findElem(link *p,int elem)刪除 link deleteElem(link p, int add)

typedef struct node{
	int elem;
	struct node *next;
}link;
link *insertElem(link *p,int elem,int add){
	//操作變量臨時
	link *temp = p;
	//先找到要插入節點的位置
	for(int i=0;i<add;i++){
		if(temp=NULL){
			printf("the position is invalid");
			return p;
		}
		temp=temp->next;
	}
	//創建插入的節點
	link *c=(link *)malloc(link);
	c->elem=elem;
	//進行插入,先把尾巴查起來
	c->next = temp->next;
	temp->next=c;
	return p
}
int findElem(link *p,int elem){
	while(p->next !=NULL){
		if(p->elem == elem){
			printf( "I have find the elem %d",p->elem);
			return p->elem;
		}
				p=p->next;
	}
	printf("not found!!\n");
	return 0;
}

link *delete(link *p,int add){
	link *temp=p;
	link *pre_node=p;
	if(add==0){//說明是頭節點
		p=p->next;
		free(temp);
		return p;
	}else{
		for(int i=0;i<add;i++){
			//記錄鏈表的上一個節點
			pre_node=temp;
			temp=temp->next;
		}
		if(p->next == NULL){//說明是尾巴節點
			pre_node->next=NULL;
			free(temp);
			return p;
		}else{//中間節點
			pre_node->next=pre_node->next-next;
			free(temp);
			return p;
		}

	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章