« Programmation C/Types avancés » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 253 :
default:
printf("Message type %d\n", ev.type);
}
</source>
 
En offrant une souplesse nécéssaire à la manipulation de l'objet, la gestion de la mémoire en C peut aider à reduire les erreurs de programmation lié à la structure de la mémoire en effet:
 
<source lang="c">
#include <stdio.h>
#include <string.h>
struct s1{
char *string;
}s1;
struct s2{
char *string;
size_t len;
int ______;
int setnull;
}s2;
union str{
struct s2 s_;
struct s1 _s;
}str;
typedef void * STR_s1;
typedef void * STR_s2;
STR_s2
string_analyse(STR_s1 *s)
{
static union str us,init_us={{NULL,0,0,0}};
memcpy((void *)&us,(void *)&init_us,sizeof(union str));
if (!((struct s1 *)s)->string)
{
return &us._s;
}
us.s_.len=strlen(((struct s1 *)s)->string);
if (!us.s_.len)
{
us.s_.setnull=1;
return &us._s;
}
us.s_.string=((struct s1 *)s)->string;
return &us.s_;
}
int main(void)
{
struct s1 s={NULL},s_={"salut"},s__={""};
void *p;
p=string_analyse((void *)&s);
printf("null? %s,%lu,%i\n", ((struct s2 *)p)->string,((struct s2 *)p)->len,((struct s2 *)p)->setnull);
p=string_analyse((void *)&s_);
printf("null? %s,%lu,%i\n", ((struct s2 *)p)->string,((struct s2 *)p)->len,((struct s2 *)p)->setnull);
p=string_analyse((void *)&s__);
printf("null? %s,%lu,%i\n", ((struct s2 *)p)->string,((struct s2 *)p)->len,((struct s2 *)p)->setnull);
printf("Réalisé en toute sécurité...\nMême pour un petit vaisseau serial killer du monde d'en haut.\n");
return 0;
}
</source>