2020 Hikvision 組み込みソフトウェア エンジニアの面接の質問

//間違ったことをした場合は、メッセージを残してください
1. C言語と比較して、アセンブリ言語(C)の移植性

  • 同じ
  • わかりません
  • 貧しい
  • より良い

分析:
アセンブリは現在のハードウェア アーキテクチャと密接に関係しており、たとえば、x86 CPU 用に作成したアセンブリは ARM では使用できません (命令、レジスタなどがすべて異なります)。同じアーキテクチャでも 32 ビット CPU 用のアセンブリは 16 ビット CPU では使用できません。アセンブリはまったく持ち運び可能ではありません。
C 言語自体はハードウェア アーキテクチャに依存しないため、移植可能です。異なるプラットフォーム上の C コンパイラは、汎用 C 言語を対応するプラットフォーム (x86、arm など) 上のアセンブリ言語に変換できます。(たとえば、一般的に使用されるコンパイラ gcc は、 gcc -S ac を使用して ac を対応するアセンブリに変換できます)

2. 以下に説明するエラーは () です。

  • パブリックメンバーセットはクラスのインターフェースになります
  • プライベートメンバーにはクラス外からアクセスできる
  • クラスのメンバーは、プライベート、保護、およびパブリック アクセスの特性によって決定されます。
  • すべてのメンバーが外部からアクセス可能

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 )testexpression 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;
フロート b;
ダブルb;
長整数 e;
char *ptr3;
短い *ptr;
int *ptr2;
char c[253];
char f[35];
短い h[33];
短いg。

ここに画像の説明を挿入

知っておきたいポイント
ポインタchar*longとunsignedlongの違い

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 を超えません。
  • 完全なバイナリ ツリーは完全バイナリ ツリーとも呼ばれます。
  • 二分木の部分木には左右の区別がない
  • バイナリ ツリーにはノードごとに最大 2 つのサブツリーがあります

二分木の知識ポイント
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) を実現する方法を見てみましょう

  • ソケット
  • パイプライン
  • 信号
  • グローバル変数

12. ヘッドおよびスタックのメモリ空間の説明は正しい (CD)

  • c の maloc スペース割り当てはスタック内にあります
  • プログラムの実行中に関数が呼び出されるとき、パラメータはスタックに渡されます。
  • スタックスペースの割り当てはオペレーティングシステムによって自動的に割り当てられます。
  • ヒープ上のスペースの手動割り当てと解放

13. 割り込み処理機能について正しいものはどれか(AC)

  • 割り込みハンドラには戻り値がありません
  • 割り込みハンドラには戻り値を含めることができます
  • 割り込みハンドラにはパラメータがありません
  • 割り込みハンドラにはパラメータを含めることができます

14. 以下の説明は正しいです (ABD)

  • 関数を呼び出すとき、実パラメータと仮パラメータの型が一致しない場合がある
  • 関数を呼び出す場合、実際のパラメータは式にすることができます
  • 関数呼び出し時、実引数と仮引数でメモリ単位を共有できる
  • 関数が呼び出されると、プログラムは実際のパラメータと仮パラメータにメモリ領域を割り当てます。

実パラメータと仮パラメータは同じでも異なっていてもよいような気がしますが、
仮パラメータ変数は呼び出し時にのみメモリ単位が割り当てられ、呼び出し終了時に割り当てられたメモリ単位は解放されます。したがって、仮パラメータは関数内でのみ有効です。関数呼び出しが終了して呼び出し関数に戻った後は、仮パラメータを再度使用することはできません。実パラメータには、
定数、変数、式、関数などを使用できます。実パラメータの量の種類に関係なく、関数が呼び出される場合、それらは仮パラメータに渡す明確な値を持つ必要があります。
したがって、実際のパラメータは、代入や入力などの方法を使用して、明確な値を事前に取得しておく必要があります。
関数呼び出し内で発生するデータ転送は一方向です。つまり、実パラメータの値は仮パラメータにのみ転送できますが、仮パラメータの値を実パラメータに戻すことはできません。したがって、関数呼び出し中に仮パラメータの値は変更されますが、実パラメータの値は変更されません。

15. 配列テーブルは 1 つだけです。配列要素の数を見つけるにはマクロ定義を使用してください
#define N (sizeof(table)/sizeof(table[0]))
16. プロセスとスレッドの違い

  • プロセスはシステム リソース割り当ての最小単位であり、スレッドはプログラム実行の最小単位です。
  • プロセスには独自の独立したアドレス空間があります。プロセスが開始されるたびに、システムは自動的にデータ セグメント、コード セグメント、およびスタック セグメントをプロセスに割り当てます。この操作は非常に高価であり、スレッドとプロセスは同じリソースを共有し、独自のローカル変数 (スタック)、共有グローバル変数とヒープ、ファイル ハンドルなどを使用するため、CPU が使用するスレッドの消費量はプロセスよりも大幅に少なくなります。
  • スレッド通信はプロセスよりもはるかに便利ですが、同期と相互排他を適切に処理する必要があり、同じプロセスの下で IP C が必要です
  • マルチプロセスはプログラムがクラッシュしにくく、スレッドは1つのスレッドがドロップされるためプログラムがクラッシュしやすい

**16. プログラムは単一のリンクリストノードの定義を実現します Link insert link *insertElem(link *p, int elem, int add), query int findElem(link *p, int elem) delete link deleteElem(link p, int加算)

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;
		}

	}
	
}

おすすめ

転載: blog.csdn.net/weixin_40178954/article/details/100632747
おすすめ