¿Cuál es la diferencia entre matrices de caracteres y cadenas en un análisis profundo?

prefacio

(1) Verifique la estación B durante el tiempo libre, consulte a un vendedor de cursos, envíe un video para preguntar, char arr1[]={'H','E','L','L','O'}; y char arr2 [] = "HOLA"; cuál es la diferencia.
(2) Después de observar el análisis del blogger que vende cursos, finalmente concluyó con éxito que la cadena tiene un '\0' más que el final de la matriz de caracteres.
(3) Bueno, desperdiciar con éxito 3 minutos de mi vida. Sin palabras, todavía vendo lecciones a este nivel. Si tienes la suerte de ver este producto, espero que puedas dejarlo claro y no te dejes engañar por esta organización sin escrúpulos que vende lecciones.
(4) Para evitar que me consideren un cañón de mapas, permítanme declarar que solo desprecio el tipo de instituciones que compran cursos con poca fuerza. ¡Aún mantengo una actitud respetuosa hacia las instituciones de formación que enseñan productos secos!

análisis superficial

tamaño de almacenamiento

(1) Tal como dijo la clase, la cadena tiene un '\0' más que el final de la matriz de caracteres. Por lo tanto, las cadenas tienen un tamaño de un byte mayor que las matrices de caracteres.

char arr1[]={
    
    'H','E','L','L','O'};
char arr2[]="HELLO";
sizeof(arr1);  //返回5
sizeof(arr2);  //返回6,因为最后有一个'\0'

Los resultados de la prueba strlen() son diferentes

(1) El que vende las conferencias no tiene agua ni cura, este nivel todavía está analizado y me siento un poco aliviado.
(2) Necesitamos saber cuál es la función de strlen(). La función strlen() puede calcular el tamaño de una cadena, pero ¿cuál es la implementación subyacente de la función strlen()?
(3) Para decirlo sin rodeos, retroceda poco a poco hasta encontrar 0 en ascii. Después de encontrar 0, salga del ciclo while y luego reste según la dirección para obtener la longitud de la cadena. (Nota: debido a que char tiene solo un byte, la longitud de la cadena se puede obtener directamente restando la dirección)
<1> Puede haber algunos estudiantes que no entiendan, por lo que analizo directamente la cadena "hola" anterior, asumiendo " hola" La dirección del primer carácter 'h' de la cadena es 0x50. Por lo tanto, el valor de str pasado a la función strlen() es 0x50.
<2>const char *s = str; Después de esta oración, s también es 0x50.
<3> Por primera vez while(), *s es 0x48 (el valor ASCII del carácter 'H' es 0x48), por lo que al ingresar al bucle, s se incrementa de 0x50 a 0x51.
<4> Siga los pasos de <3> 4 veces, cuando s es 0x54, mientras (*s), *s es 0x4F (el valor ASCII del carácter 'O' es 0x48), en este momento s se incrementa automáticamente otra vez.
<5> Aquí viene la clave, la quinta mientras (*s), encontramos que el valor de *s en realidad es 0. Así que salga del ciclo while ().
<6>Luego s - str =5 para calcular la longitud de la cadena.

inserte la descripción de la imagen aquí

size_t strlen(const char *str) {
    
    
    const char *s = str;
    while (*s)
        s++;
    return s - str;
}

(4) Ahora que conocemos el principio de strlen, veamos la matriz de caracteres.En la matriz de caracteres, char arr1[]={'H','E','L','L','O'}; el valor detrás del carácter 'O' es desconocido, puede ser 0 o algún otro valores, por lo que no se puede determinar la longitud de la matriz de caracteres probada por strlne().

Resumir

(1) Lo anterior es un conocimiento muy simple, pero cualquiera que haya estudiado seriamente el lenguaje C puede entenderlo. Realmente no entiendo por qué el profesor entendió algo tan misterioso.
(2) En resumen esLa cadena tiene un '\0' más que el final de la matriz de caracteres, por lo que el tamaño de almacenamiento es inconsistente con el resultado de strlen().

Análisis en profundidad

La ubicación de almacenamiento es diferente.

(1)Las cadenas se almacenan en el área constante; en términos generales, el área constante se almacena en ROM.
(2)La ubicación de almacenamiento de la matriz de caracteres depende de la situación. Pero todo está almacenado en la RAM.
<1> Si la matriz de caracteres es una variable global, se almacena en el área de datos estáticos.
<2> Si la matriz de caracteres es una variable local, se almacena en la pila.

Modificar permisos no es lo mismo

(1) La cadena se almacena en el área constante, por lo que no tiene permiso de modificación.La CPU no puede modificar la cadena.
(2) La matriz de caracteres son datos estáticos o en la pila.La CPU puede modificar la matriz de caracteres.

El tamaño de almacenamiento al apagar es diferente

(1) Para la cadena, está en el área constante, por lo que incluso si la máquina está apagada, sus datos aún existen.
(2) Pero para matrices de caracteres, si es una variable local. Sus datos desaparecerán después de un corte de energía. Pero la matriz de caracteres es una variable global y sus datos seguirán existiendo en la ROM.
(3) Para los estudiantes que no entienden esto, pueden ver que la RAM perderá datos cuando se apague. ¿Por qué las variables globales inicializadas se almacenan en la RAM? Almacenamiento de programas de análisis detallados.

Supongo que te gusta

Origin blog.csdn.net/qq_63922192/article/details/132494886
Recomendado
Clasificación