c sizeof strlen

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.