Pb de malloc
pom
-
pom -
pom -
Bonjour, j'ai un pb de malloc. Voici tout d'abord ce que j'ai fait :
typedef struct t_mat
{
int dim;
double * data;
} Tableau;
void alloc_Tableau(Tableau *t,unsigned int dim_)
{
assert(dim_>0);
t->dim=dim_;
t->data=malloc(dim_*sizeof(double));
assert(t->data!=NULL);
int i;
for(i=0;i<t->dim;i++)
t->data[i]=0.;
return ;
}
void free_Tableau(Tableau * t)
{
free(t->data);
t->data=NULL;
return ;
}
void affiche_Tableau(Tableau t)
{
if(t.data==NULL)
printf("\nTableau inexistant\n");
else
{
int i;
for(i=0;i<t.dim;i++)
printf("%3.5g\t",t.data[i]);
printf("\n");
}
return;
}
Dans le main je fais la chose suivante :
Tableau t1;
alloc_Tableau(&t1,3);
affiche_Tableau(t1);
free_Tableau(&t1);
et là j'obtiens bien la sortie : 0 0 0
Maintenant si je fais
Tableau * t2
alloc_Tableau(t2,3);
et bien j'ai une erreur de segmentation. Savez-vous pourquoi ?
Merci beaucoup.
typedef struct t_mat
{
int dim;
double * data;
} Tableau;
void alloc_Tableau(Tableau *t,unsigned int dim_)
{
assert(dim_>0);
t->dim=dim_;
t->data=malloc(dim_*sizeof(double));
assert(t->data!=NULL);
int i;
for(i=0;i<t->dim;i++)
t->data[i]=0.;
return ;
}
void free_Tableau(Tableau * t)
{
free(t->data);
t->data=NULL;
return ;
}
void affiche_Tableau(Tableau t)
{
if(t.data==NULL)
printf("\nTableau inexistant\n");
else
{
int i;
for(i=0;i<t.dim;i++)
printf("%3.5g\t",t.data[i]);
printf("\n");
}
return;
}
Dans le main je fais la chose suivante :
Tableau t1;
alloc_Tableau(&t1,3);
affiche_Tableau(t1);
free_Tableau(&t1);
et là j'obtiens bien la sortie : 0 0 0
Maintenant si je fais
Tableau * t2
alloc_Tableau(t2,3);
et bien j'ai une erreur de segmentation. Savez-vous pourquoi ?
Merci beaucoup.
3 réponses
Vérifie ton appel à alloc_Tableau...
Cela compile et tourne, non ?
johand@horus:~/src/c/tableau$ cat tableau.c
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
typedef struct t_mat
{
int dim;
double * data;
} Tableau;
void alloc_Tableau(Tableau *t,unsigned int dim_, double val)
{
assert(dim_>0);
t->dim=dim_;
t->data=malloc(dim_*sizeof(double));
assert(t->data!=NULL);
int i;
for(i=0;i<t->dim;i++)
t->data[i]=val;
return ;
}
void free_Tableau(Tableau * t)
{
free(t->data);
t->data=NULL;
return ;
}
void affiche_Tableau(Tableau t)
{
if(t.data==NULL)
{
printf("\nTableau inexistant\n");
}
else
{
int i;
for(i=0;i<t.dim;i++)
printf("%3.5g\t",t.data[i]);
printf("\n");
}
}
void main(void)
{
Tableau t2;
alloc_Tableau(&t2, 3, 3.14159);
affiche_Tableau(t2);
free_Tableau(&t2);
}
johand@horus:~/src/c/tableau$ touch tableau.c ; make tableau; ./tableau
cc tableau.c -o tableau
tableau.c: In function 'main':
tableau.c:46: warning: return type of 'main' is not 'int'
3.1416 3.1416 3.1416
Cela compile et tourne, non ?
alloc_Tableau(&t2, 3, 3.14159);
As tu effectué cet appel?
Quel message d'erreur?
Quel compilateur?
J'ai testé sous Debian et cygwin avec succès.
Par contre, le compilateur Microsoft me jette
Mais je ne suis pas spécialiste de ce compilo...
Johan
As tu effectué cet appel?
Quel message d'erreur?
Quel compilateur?
J'ai testé sous Debian et cygwin avec succès.
Par contre, le compilateur Microsoft me jette
[G:\cygwin\home\root\src\C\tableau]cl /c /TC tableau.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. tableau.c tableau.c(18) : error C2143: syntax error : missing ';' before 'type' tableau.c(19) : error C2065: 'i' : undeclared identifier
Mais je ne suis pas spécialiste de ce compilo...
Johan
Avant je faisais du c++. J'ai essayé de faire
void alloc_Tableau(Tableau * t,unsigned intN,double val=0)
et ensuite de faire
Tableau t1;
alloc_Tableau(&t1,3) (le 3e argument vaut par défaut 0).
J'ai l'impression que ca ne marche pas en C. Le compilo m'a gentilement jeté.
Merci.