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

Contenu supprimé Contenu ajouté
Holaff (discussion | contributions)
Ligne 256 :
</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 (erreur de segmentation/segfault/"Argh!!!") en effet:
 
<source lang="c">
Ligne 306 :
printf("Réalisé en toute sécurité...\nMême pour un petit vaisseau serial killer du monde d'en haut.\n");
return 0;
}
</source>
Tout en permettant l'optimisation:
<source lang="c">
struct s1{
size_t len;
char *str;
}s1;
union s{
struct s1 double[2];
void *perform[5];
struct s1 simple;
};
</source>
<br>
<table border=1 cellspacing=0 cellpadding=5>
<tr>
<td>void *</td>
<td>void *</td>
<td>void *</td>
<td>void *</td>
<td align="center">void *</td>
</tr>
<tr>
<td>size_t</td>
<td>char *</td>
<td>size_t</td>
<td>char *</td>
<td align="center">---</td>
</tr>
<tr>
<td>size_t</td>
<td>char *</td>
<td colspan="2" align="center">------</td>
<td align="center">---</td>
</tr>
<td>8bits</td>
<td>8bits</td>
<td>8bits</td>
<td>8bits</td>
<td>2int=8bits</td>
</tr>
<table>
ce qui signifie que:
<source lang="c">
int main(void)
{
const char *end[2]={", ","\n"};
union s init={{{5,"Salut"},{3,"toi"}}},us;
void *p;
memset((void *)&us, 0,48);
memcpy((void *)&us,
(void *)&init,
2*sizeof(struct s1));
for ( p=&us;
((union s *)p)->perform[0]!=(void *)0;
p+=16
) printf("%s%s",
(char *)((union s *)p)->perform[1],
end[
!((char *)((union s *)p)->perform[2])]
); return 0;
}
</source>