Pregunta sobre la memoria del programa (funciona a pesar de la memoria insuficiente)

Estoy escribiendo este programa en un PIC de Microchip.

 char * we_are_display = "hello";
 char ahimouz[2];
 sprintf(ahimouz,"%s %s",we_are_display,"5");
 WriteStringToLCD(ahimouz);

Este programa funciona a pesar de que la memoria asignada a la matriz ahimouzes de solo 2 bytes. ¿Por qué es así?

ingrese la descripción de la imagen aquí

Creo que esta es una pregunta de programación y, por lo tanto, está fuera de tema.
Cambiaría char ahimouz[2]a char *ahimouz, prueba esto.
Estimado Makouda, el mensaje que recibió de StackOverflow podría significar que hizo demasiadas preguntas de baja calidad y el sitio bloqueó su cuenta por eso. Entonces, no tiene nada que ver con que esta pregunta sea sobre el tema allí o aquí. Ya has hecho una pregunta que tiene 5 votos negativos aquí . Si no tiene cuidado con la calidad de sus preguntas, tampoco podrá hacer preguntas aquí.
La prohibición de preguntas no se transfiere de SO a este sitio. Además, no veo nada de malo en esta pregunta: la programación integrada está en el tema.
@Electropper: ¡tu comentario es simplemente incorrecto! En lugar de una matriz de tamaño insuficiente que usa el OP, en su lugar, está proponiendo escribir a través de un puntero no inicializado . ¡No ha asignado ninguna memoria para recibir la salida de sprintf!
Puede que no esté prohibido aquí, pero en realidad no hay nada incrustado, específico al respecto, y está atrayendo más que su parte justa de respuestas completamente incorrectas.

Respuestas (1)

En su ejemplo, no se ha quedado sin memoria, simplemente no ha asignado suficiente memoria para contener la cadena. El resto terminará en un área de memoria que está disponible para el procesador pero que el compilador no conoce. Si bien es posible que no cause un problema con este ejemplo simple, en la práctica puede sobrescribir otras variables y áreas de memoria y debe evitarse.

Además, como Majenko mencionó en un comentario, es posible que desee ver snprintfcuál es una versión más segura de usar porque también incluye un parámetro para especificar la longitud del búfer. No todos los compiladores PIC lo admiten, pero si el tuyo lo hace, la sintaxis sería:

snprintf(ahimouz, sizeof(ahimouz), "%s %s", we_are_display, "5");

Eso evitaría la posibilidad de que se sobrescriban otras áreas de la memoria, aunque también solo se mostraría hporque el tamaño de su búfer solo es lo suficientemente grande como para contener un solo carácter más el terminador nulo.

Es posible que desee ampliar la respuesta para mencionar que se prefiere snprintf() sobre sprintf() para evitar este tipo de desbordamientos de búfer.
@Majenko, buen punto, no estoy seguro de que Microchip C8 lo admita, pero sin duda otros lo harían.