Re: Erreur de segmentation
Citation:
Envoyé par Trunks
Bonjour, je veux afficher des résultats d un cos et sin en float, mais ca me fait une erreur de segmentation sous gcc et je ne comprends pas pourquoi
Comportement indéfini (débordement de tableau).
Pas mal d'erreurs d'allocations et des mauvaises pratiques :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/// Some <math.h> files do not define M_PI...
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
int main ()
{
/* -ed-
float **ps;
mieux vaut definir et initialiser en meme temps quand c'est possible
*/
/* -ed-
int i, nvertices = 8;
le bon type pour les indices et les tailles est size_t.
*/
size_t i;
size_t nvertices = 8;
/* -ed-
ps = (float**) malloc(nvertices);
Suppression du cast inutile.
La taille a allouer est n * sizeof *p. Toujours.
malloc() peut echouer...
*/
float **ps = malloc (nvertices * sizeof *ps);
if (ps != NULL)
{
/* -ed- ajoute detection d'erreur d'allocation. */
int err = 0;
for (i = 0; i < nvertices; i++)
{
/* -ed-
ps[i] = (float *) malloc (3);
Suppression du cast inutile.
La taille a allouer est n * sizeof *p. Toujours.
malloc() peut echouer...
*/
ps[i] = malloc (3 * sizeof *ps[i]);
err = ps[i] == NULL;
}
if (!err)
{
for (i = 0; i < nvertices; i++)
{
ps[i][0] = cos (i * (2 * M_PI) / nvertices);
ps[i][1] = sin (i * (2 * M_PI) / nvertices);
ps[i][2] = 0.0;
}
for (i = 0; i < nvertices; i++)
{
/* -ed- ameliore le format */
#define FMT "%9.6f"
printf ("(" FMT ", " FMT ", " FMT ")\n"
,ps[i][0]
,ps[i][1]
,ps[i][2]);
#undef FMT
}
}
for (i = 0; i < nvertices; i++)
{
/* -ed- ajoute forcage a NULL */
free (ps[i]), ps[i] = NULL;
}
free (ps);
}
/* -ed- Jusqu'a C90/NA1 (aka C95), le return de main doit etre explicite. */
return 0;
} |