Cuando quiero un verdadero peso ligero (y/o una que es thread-safe) de la biblioteca que suelo escribir mi propia. No es difícil de hacer.
Ya se habla de un "asignador de memoria," permítanme sugerir que un malloc()/par es trivial para escribir, quizás una docena de líneas:
#define STATUSFREE 0
#define STATUSUSED 1
struct tag {
struct tag * next;
int status;
};
struct tag * heap;
void free( void * p ) {
struct tag * ptag= ((struct tag *)p) - 1;
ptag->status= STATUSFREE;
}
void * malloc( size_t s ) {
struct tag *ptag, *pnext;
for ( ptag= heap; ptag != NULL; ptag= ptag->next )
if (ptag->status == STATUSFREE) {
for ( pnext= ptag->next; pnext->status == STATUSFREE; pnext= pnext->next )
;
if ( s <= (size_t) (((char *) pnext) - (char *) (ptag+1)) ) {
if ( s <= (size_t) (((char *) pnext) - (char *) (ptag+2)) ) {
ptag->next= (struct tag *) (s + (char *) (ptag+1));
ptag->next->status= STATUSFREE;
ptag->next->next= pnext;
} else
ptag->next= pnext;
ptag->status= STATUSUSED;
return ptag+1;
}
ptag->next= pnext;
}
return NULL;
}
Inicializar la siguiente forma. En primer lugar, establecer un bloque fijo de la memoria utilizando un estándar de la matriz de asignación de como esta:
static char mspace[1000];
Que puede ser colocado en algún módulo de escribir. Debe ser asignado como estática de toda la vida, por supuesto.
Entonces, en algún otro lugar (como en main()), hacer lo siguiente:
((struct tag *) &mspace[0])->status= STATUSFREE;
((struct tag *) &mspace[0])->next= &((struct tag *) &mspace[sizeof(mspace)])[-1];
((struct tag *) &mspace[sizeof(mspace)])[-1].status= STATUSUSED;
((struct tag *) &mspace[sizeof(mspace)])[-1].next= NULL;
heap= (struct tag *) &mspace[0];
Es muy rápido y muy fácil.
la función strlen() es, por supuesto, mucho más fácil y usted puede encontrar toda la manera de la aplicación en la web para eso.
El resto? Me gustaría recomendar que se escribe también. Un libro muy útil aquí es P. J. Plauger (uno de los fundadores de Whitesmiths LTD -- compilador de la empresa) "La Biblioteca Estándar de c." Acaba de obtener una copia. Usted no se arrepentirá. Cubre cosas como sprintf() para usted, que es mucho más complicado y puede implicar el tratamiento con valores de punto flotante cuando la conversión para la salida. (Cuando vuelva a crear sprintf(), se va a transportar en un montón de código como resultado de que-pero es necesario si usted quiere una potente función de la biblioteca.)