online biblioteca c strlen

biblioteca - strlen no comprobando si está nulo



strlen online (6)

¿Por qué strlen() no comprueba NULL?

Si hago strlen(NULL) , seg fallas.

Tratando de entender la razón detrás de esto (si existe).


El estándar no lo requiere, por lo que las implementaciones simplemente evitan una prueba y potencialmente un salto costoso.


La parte del standard idioma que define la biblioteca de manejo de cadenas indica que, a menos que se especifique lo contrario para la función específica, cualquier argumento de puntero debe tener valores válidos.

La filosofía detrás del diseño de la biblioteca estándar de C es que el programador está, en última instancia, en la mejor posición para saber si realmente se necesita realizar una verificación en tiempo de ejecución. En los días en que la memoria total del sistema se medía en kilobytes, la sobrecarga de realizar una verificación de tiempo de ejecución innecesaria podría ser bastante dolorosa. Así que la biblioteca estándar de C no se molesta en realizar ninguna de esas comprobaciones; asume que el programador ya lo ha hecho si es realmente necesario. Si sabe que nunca pasará un valor de puntero incorrecto a strlen (por ejemplo, está pasando un literal de cadena o una matriz asignada localmente), entonces no hay necesidad de saturar el binario resultante con una comprobación innecesaria contra NULL.


La razón detrás de esto es simple: ¿cómo se puede verificar la longitud de algo que no existe?

Además, a diferencia de los "idiomas administrados", no hay expectativas de que el sistema de tiempo de ejecución maneje correctamente los datos o las estructuras de datos no válidos. (Este tipo de problema es exactamente el motivo por el cual los lenguajes más "modernos" son más populares para aplicaciones que no requieren computación o que tienen menos rendimiento).

Una plantilla estándar en c se vería así

int someStrLen; if (someStr != NULL) // or if (someStr) someStrLen = strlen(someStr); else { // handle error. }


Tres razones significativas:

  • La biblioteca estándar y el lenguaje C están diseñados asumiendo que el programador sabe lo que está haciendo, por lo que un puntero nulo no se trata como un caso de borde, sino como un error de un programador que resulta en un comportamiento indefinido;

  • strlen gastos generales de tiempo de ejecución: llamar a strlen miles de veces y hacer siempre str != NULL no es razonable a menos que el programador sea tratado como un mariquita;

  • Se suma al tamaño del código: solo podrían ser unas pocas instrucciones, pero si adopta este principio y lo hace en cualquier lugar, puede inflar su código de manera significativa.


Una pequeña macro para ayudar a tu dolor:

#define strlens(s) (s==NULL?0:strlen(s))