merde K&R pour moi c'était simplement une manière de mettre des accolades (manière ne me convenant pas

donc je ne l'ai jamais lu)
et voila vous allez encore me traiter d’hérétique
la concrètement je fait un utilitaire pouvant trifouiller les dump redis,
redis sauve l'intégralité des clef dans un fichier unique, donc on à tout ou rien :/
mon but est d'avoir de quoi refaire des fichier dump via des requêtes perso, et également dégager certaines clef des dump style dans mon cas le caches des pages de mes sites
dans un premier temps je bosse avec un format de fichier perso, dumpant moi même la base mais plus tard se sera depuis les vrai dump de redis, mais aucune doc n'existe faut reverser..
bref pour répondre vraiment à ta question, étant old school et hérétique je bosse à l'ancienne, juste de la mémoire et des pointeur
u32 nbkey = keys->elements;
if(!nbkey){ printf("not any result."); return 1; }
printf("%u keys found.",nbkey);
char * header = (char*)malloc(nbkey*2056); // 2ko max for key name
memset(header,0,nbkey*2056);
u32 * p = (u32*)header;
*p++ = 0x42424242; // magic
*p++ = nbkey; // nbkeys
u32 *koffset = p; p += nbkey;
u16 *knamesz = (u16*)p; // keys name size
u16 *ktype = &(knamesz[nbkey]); // keys type
char *knames = (char*)&(ktype[nbkey]);
char *keybuf = knames;
for(u32 n=0;n<nbkey;n++)
{ koffset[n] = 0; // clear offset for now
knamesz[n] = (u16)(keys->element[n]->len + 1); // write key name length (add the \0)
strcpy(keybuf,keys->element[n]->str); // copie name, fill with 0
redisAppendCommand(c,"TYPE %s",keys->element[n]->str); // pipeline get key type
//printf("\nkey %u : %s",n,keybuf);
keybuf += knamesz[n];
}
u32 diff = (keybuf-header);
if(diff%4) diff += 4-(diff%4);
koffset[0] = diff;
donc concrètement, ici je compte le nombre d'octet entre le début de mon fichier (en mémoire) et la fin de l'header, pour écrire tout ca dans une zone mémoire destiné a recueillir les offset depuis le début du fichier ou se trouve les données de chaque clefs de la base
en gros juste une soustraction de char*