"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué `strlen` y `sizeof` producen resultados diferentes para cadenas basadas en punteros y cadenas basadas en matrices en C?

¿Por qué `strlen` y `sizeof` producen resultados diferentes para cadenas basadas en punteros y cadenas basadas en matrices en C?

Publicado el 2024-11-16
Navegar:731

Why do `strlen` and `sizeof` produce different results for pointer-based and array-based strings in C?

Salidas distintas en cálculos de longitud y tamaño de cadena para inicialización de cadena basada en puntero y basada en matriz

Comprensión de los resultados

Al crear una cadena str1 basada en puntero y una cadena str2 basada en matriz con el mismo valor, las funciones strlen y sizeof producen resultados diferentes. Específicamente, para las declaraciones:

char *str1 = "Sanjeev";
char str2[] = "Sanjeev";

strlen devuelve 7 tanto para str1 como para str2, ya que mide la longitud de la secuencia de caracteres, excluyendo el terminador nulo (\0) al final.

Sin embargo, sizeof produce valores diferentes:

  • sizeof(str1) devuelve 4 porque evalúa el tamaño de la variable de puntero, que normalmente es de 4 bytes (sistemas de 32 bits).
  • sizeof(str2) devuelve 8 porque determina el tamaño de la matriz, que incluye el terminador nulo, lo que da como resultado 8 bytes (7 caracteres 1 terminador nulo).

El Diferencia subyacente: tipo de datos versus asignación de memoria

sizeof mide el tamaño del tipo de datos, mientras que strlen mide la longitud de la secuencia de caracteres. En el caso de str1, es un puntero a un carácter, por lo que sizeof devuelve el tamaño del puntero. Para str2, es una matriz de caracteres, por lo que sizeof devuelve el tamaño de toda la matriz, incluido el terminador nulo.

Una mirada más cercana

Para demostrar la distinción mejor, considere:

char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;

Ahora, tanto str1 como str2 apuntan a la misma matriz. Sus valores strlen son 7, pero sus valores sizeof difieren:

  • sizeof(str1) es 4 (tamaño del puntero)
  • sizeof(str2) es 8 (tamaño de matriz con terminador nulo )

Esto ejemplifica cómo la evaluación del tamaño depende de la estructura de datos subyacente.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3