La última línea es un comando de ejemplo para ejecutar para demostrar el bloqueo con el programa de ejemplo. Básicamente, causa que perl imprima 2.100.000 veces "5" y luego lo transfiera al stdin del programa "a.out" (que se supone que es el programa de ejemplo compilado).
En primer lugar, scanf()
se debe utilizar para la prueba solamente, no en programas del mundo real debido a varios problemas que no manejará correctamente (por ejemplo, pidiendo "% i" pero las entradas de usuario "12345abc" (el "abc" permanecerá en stdin y podría hacer que se rellenen las siguientes entradas sin posibilidad de que el usuario las cambie).
Al respecto de este problema: scanf()
sabrá que debe leer un valor entero, sin embargo, no sabrá cuánto tiempo puede ser. El puntero podría apuntar a un entero de 16 bits, un entero de 32 bits o un entero de 64 bits o algo aún más grande (que no se sabe). Funciones con un número variable de argumentos (definido con ...
) don ' t saber el tipo de datos exacto de los elementos pasados, por lo que tiene que volver a en la cadena de formato (razón por la cual las etiquetas de formato no son opcionales, como en C# donde solo las numera, p. "{0} {1} {2}"
). Y sin una longitud determinada, tiene que asumir algo de longitud que también podría depender de la plataforma (lo que hace que la función sea aún más segura de usar).
En general, considérelo posiblemente nocivo y un punto de partida para los ataques de desbordamiento del búfer. Si desea proteger y optimizar su programa, comience reemplazándolo con alternativas.
"Presione cualquier tecla para continuar." "¿Dónde está la clave?" – Dave
@Dave: ????? Su comentario parece spam :( –
¿Qué? No. Según la redacción de su pregunta, parecía que estaba malinterpretando la frase "datos de entrada enormes": no es algo que escriba, es una propiedad de la entrada. el mismo escenario que el clásico cualquier chiste clave, que estaba usando como metáfora de tu problema. – Dave