c - Sizeof vs Strlen
size of string php (4)
#include "stdio.h"
#include "string.h"
main()
{
char string[] = "october"; // october is 7 letters
strcpy(string, "september"); // september is 9 letters
printf("the size of %s is %d and the length is %d/n/n", string, sizeof(string), strlen(string));
return 0;
}
Salida:
el tamaño de septiembre es 8 y la longitud es 9
¿Hay algo mal con mi sintaxis o qué?
Debe eliminar el problema de desbordamiento de búfer en este ejemplo. Una forma de hacerlo es usar strncpy
:
memset(string, 0, sizeof(string));
strncpy(string, "september", sizeof(string)-1);
La salida es correcta porque
El compilador asignó el primer tamaño de cadena de declaración a 7 + 1 (octubre tiene 7 bytes y 1 byte para el terminador nulo en el momento de la compilación)
Segunda afirmación: está copiando septiembre (cadena de 9 bytes a 8 bytes);
para ti tienes el tamaño de septiembre como 8 bytes (todavía strlen()
no funcionará para septiembre, no tiene carácter nulo)
Su matriz de destino tiene 8 bytes (longitud de "octubre" más / 0) y desea poner 9 caracteres en esa matriz.
man strcpy
dice: Si la cadena de destino de strcpy () no es lo suficientemente grande, entonces podría pasar cualquier cosa.
Por favor, dime lo que realmente quieres hacer, porque huele mal.
sizeof
y strlen()
hacen cosas diferentes. En este caso, tu declaración
char string[] = "october";
es lo mismo que
char string[8] = "october";
entonces el compilador puede decir que el tamaño de la string
es 8. Lo hace en tiempo de compilación.
Sin embargo, strlen()
cuenta el número de caracteres en la cadena en tiempo de ejecución. Entonces, después de llamar a strcpy()
, la string
ahora contiene "septiembre". strlen()
cuenta los caracteres y encuentra 9 de ellos. Tenga en cuenta que no ha asignado suficiente espacio para la string
para contener "septiembre". Este es un comportamiento indefinido.