Sizeof vs Strlen

#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 syntax o qué?

sizeof y strlen() hacen cosas diferentes. En este caso, tu statement

 char string[] = "october"; 

es lo mismo que

 char string[8] = "october"; 

entonces el comstackdor puede decir que el tamaño de la string es 8. Lo hace en tiempo de comstackció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.

La salida es correcta porque

El comstackdor asignó el primer tamaño de cadena de statement a 7 + 1 (octubre tiene 7 bytes y 1 byte para el terminador nulo en el momento de la comstackció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.

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