Preguntas de la entrevista para ingenieros de software integrado de Hikvision 2020

// Si hace algo mal, deje un mensaje
1. En comparación con el lenguaje C, la portabilidad del lenguaje ensamblador (C)

  • Mismo
  • no lo sé
  • pobre
  • mejor

Análisis:
el ensamblaje está estrechamente relacionado con la arquitectura de hardware actual. Por ejemplo, el ensamblaje que escribe para la CPU x86 no se puede usar en ARM (las instrucciones, los registros, etc. son todos diferentes). El ensamblaje para una CPU de 32 bits no se puede utilizar en una CPU de 16 bits incluso con la misma arquitectura. El montaje no es nada portátil.
El lenguaje C en sí es independiente de la arquitectura del hardware, por lo que es portátil. Los compiladores de C en diferentes plataformas pueden convertir el lenguaje C de uso general en lenguaje ensamblador en la plataforma correspondiente (x86, arm, etc.). (Por ejemplo, el compilador gcc de uso común puede usar gcc -S ac para convertir ac en el ensamblado correspondiente como)

2. El error que se describe a continuación es ()

  • El conjunto de miembros públicos se convierte en la interfaz de la clase.
  • Se puede acceder a miembros privados fuera de la clase.
  • Los miembros de la clase están determinados por características de acceso privado, protegido y público.
  • Se puede acceder a todos los miembros externamente.

* 3. Respecto a la declaración char ptr = malloc(0), la siguiente descripción es incorrecta (C)

  • Al devolver un valor de memoria específico, ptr ocupa una cierta cantidad de espacio de memoria
  • puede devolver un valor específico
  • puede devolver NULL
  • Al devolver un valor de memoria específico, el espacio de memoria ocupado por ptr no se puede usar ni liberar

Análisis
Cuando se usa malloc, solo se devolverá NULL si no hay suficiente memoria, o se informará una excepción a
malloc (0), lo que indica que el sistema se ha preparado para usted. La dirección inicial utilizada en la pila simplemente no está permitida. para leer y escribir,
NULL Generalmente se define como (void *) 0, apuntando a la dirección de 0, malloc es el programa que asigna espacio en la pila, no será la dirección 0 Por ejemplo:
int
pp =(strlen((ptr= (char *)malloc(0))0 display Error
malloc(0) se refiere al espacio asignado el tamaño de la memoria es 0
NULL no apunta a ninguna entidad
mallo(0) también es una existencia no es NULL

**4. Supongamos que char test[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};int test_p = (int )expresión de prueba int a=test_p[1]; en modo big endian Almacenado en la dirección de memoria de 1000~1003H, entonces lo que se almacena en 1000H es (D)

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

5. Existe la siguiente estructura en el sistema de 32 bits: ¿
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;tamaño de (HKVISION)?¿Cómo optimizar? ?

400
优 化
int a;
flotador b;
doble b;
largo int e;
carácter *ptr3;
corto *ptr;
int*ptr2;
carácter c[253];
carácter f[35];
h corta [33];
g corto;

inserte la descripción de la imagen aquí

Puntos de conocimiento
La diferencia radica en el puntero char * long y unsigned long

Compilador de 32 bits:

  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个字节

Compilador de 64 bits:

  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. Qué subprocesos en el sistema Linux no se pueden compartir (C)

  • variable global
  • montón
  • la pila
  • identificador de archivo

Puntos de prueba
La diferencia entre proceso e hilo - recitación

6. La descripción del árbol binario es correcta (D)

  • La profundidad del árbol binario no supera los 256.
  • Un árbol binario completo también se llama árbol binario completo.
  • Los subárboles del árbol binario no tienen distinción entre izquierda y derecha
  • Un árbol binario tiene como máximo dos subárboles por nodo.

Puntos de conocimiento del árbol binario
https://blog.csdn.net/u013834525/article/details/80506126

7. El principio de funcionamiento de TCP es incorrecto (D)

  • Los datos de la aplicación se segmentan en fragmentos de datos que TCP considera más apropiados para enviar.
  • TCP proporciona control de flujo
  • TCP mantiene su encabezado y suma de verificación de datos, que es una suma de verificación de un extremo a otro.
  • El segmento TCP se transmite como un datagrama IP y el datagrama IP puede llegar desordenado, por lo que el mensaje TCP puede llegar desordenado. En este caso, la capa de aplicación lo recibe desordenado.

8. MTU especifica el tamaño máximo de paquetes de datos que se pueden transmitir en la red, comúnmente utilizado en Ethernet, MTU es de unos pocos bytes (A)

  • 1500
  • aleatorio
  • 1024
  • 100

Aquí hay que distinguirlo del puerto IP: el
protocolo 65536 también puede corregir
el mss

9. El espacio máximo de direccionamiento de un programa de 32 bits es (C)

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

2^32=4G

10. Lo que la CPU puede ejecutar es (D)

  • ejecución en lenguaje de máquina
  • Lenguaje de máquina versus lenguaje ensamblador
  • Lenguaje de máquina versus lenguaje ensamblador versus programas de lenguaje de descripción de hardware
  • Programas en lenguaje de máquina y lenguaje de descripción de hardware.

11. Echemos un vistazo a las formas de lograr la comunicación entre procesos (ABC) en el sistema Linux.

  • Enchufe
  • tubería
  • Señal
  • variable global

12. La descripción del espacio de memoria Head y Stack es correcta (CD)

  • La asignación de espacio maloc en c está en la pila
  • Los parámetros se pasan a la pila cuando se llama a la función durante la ejecución del programa.
  • La asignación de espacio de pila la asigna automáticamente el sistema operativo
  • Asignación manual y liberación de espacio en el montón.

13. ¿Cuál de las siguientes afirmaciones sobre la función de procesamiento de interrupciones es correcta (AC)?

  • El controlador de interrupciones no tiene valor de retorno
  • Los manejadores de interrupciones pueden tener valores de retorno
  • El manejador de interrupciones no tiene parámetros.
  • Los manejadores de interrupciones pueden tener parámetros

14. La siguiente descripción es correcta (ABD)

  • Al llamar a una función, los tipos de parámetros reales y formales pueden ser inconsistentes
  • Al llamar a una función, el parámetro real puede ser una expresión
  • Al llamar a una función, el parámetro real y el parámetro formal pueden compartir la unidad de memoria
  • Cuando se llama a una función, el programa asigna espacio de memoria para los parámetros reales y formales.

Siento que los parámetros reales y los parámetros formales pueden ser iguales o diferentes.
Las variables de parámetros formales solo se asignan unidades de memoria cuando se llaman, y las unidades de memoria asignadas se pueden liberar al final de la llamada. Por tanto, los parámetros formales sólo son válidos dentro de la función. Una vez que finaliza la llamada a la función y regresa a la función que llama, el parámetro formal no se puede usar nuevamente. El parámetro
real puede ser constante, variable, expresión, función, etc. No importa qué tipo de cantidad sea el parámetro real, cuando la función es llamados, deben tener valores definidos para pasar a los parámetros formales.
Por lo tanto, se deben utilizar métodos como la asignación y la entrada con antelación para obtener un valor definido para el parámetro real.
La transferencia de datos que ocurre dentro de una llamada a función es unidireccional. Es decir, el valor del parámetro real solo se puede transferir al parámetro formal, pero el valor del parámetro formal no se puede transferir nuevamente al parámetro real. Por lo tanto, durante la llamada a la función, el valor del parámetro formal cambia, pero el valor en el parámetro real no cambia.

15. Solo hay una tabla de matriz, utilice la definición de macro para encontrar el número de elementos de la matriz
#define N (tamaño de (tabla)/tamaño de (tabla [0]))
16. La diferencia entre proceso y subproceso

  • Un proceso es la unidad más pequeña de asignación de recursos del sistema y un subproceso es la unidad más pequeña de ejecución del programa.
  • Un proceso tiene su propio espacio de direcciones independiente. Cada vez que se inicia un proceso, el sistema le asignará automáticamente segmentos de datos, segmentos de código y segmentos de pila. Esta operación es muy costosa, y los subprocesos y procesos comparten los mismos recursos y solo tienen sus propias variables locales (pila), variables globales compartidas y montón, identificadores de archivos, etc., por lo que la CPU gasta subprocesos significativamente menos que los procesos.
  • La comunicación de subprocesos es mucho más conveniente que los procesos, pero la sincronización y la exclusión mutua deben manejarse bien, y se requiere IP C en el mismo proceso.
  • El multiproceso no es fácil de hacer que el programa falle, y el subproceso es fácil de hacer que el programa falle porque se descarta un subproceso

** 16. El programa realiza la definición del nodo de lista enlazada única Enlace insertar enlace *insertElem(link *p, int elem, int add), consulta int findElem(link *p, int elem) eliminar enlace eliminarElem(link p, int agregar )

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

	}
	
}

Supongo que te gusta

Origin blog.csdn.net/weixin_40178954/article/details/100632747
Recomendado
Clasificación