Erreur de segmentation irrésolvable
Bonjour, j'ai une erreur de segmentation avec mon module EnsembleChaine que je n'arrive pas à résoudre depuis plusieurs heures. Mon module stocke des chaînes de caractère dans un tableau.
Voici ma structure et mon constructeur qui pose problème :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| struct EnsembleChaine
{
char** s;
int nb;
};
EnsembleChaine creerEnsembleChaine(void)
{
EnsembleChaine this;
this->s=malloc(sizeof(char*)*SIZE_DEFAULT);
for(int i=0;i<SIZE_DEFAULT;i++)
{
this->s[i]=malloc(sizeof(char)*SIZE_DEFAULT);
for(int j=0;j<SIZE_DEFAULT;j++)
{
this->s[i][j]='\0';
}
}
this->nb=0;
return this;
} |
J'ai une erreur de segmentation sur cette ligne :
Code:
this->s[i][j]='\0';
Pourtant, pour moi tout est correct. J'ai enlevé la boucle for comme ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| EnsembleChaine creerEnsembleChaine(void)
{
EnsembleChaine this;
this->s=malloc(sizeof(char*)*SIZE_DEFAULT);
for(int i=0;i<SIZE_DEFAULT;i++)
{
this->s[i]=malloc(sizeof(char)*SIZE_DEFAULT);
//for(int j=0;j<SIZE_DEFAULT;j++)
//{
//this->s[i][j]='\0';
//}
}
this->nb=0;
return this;
} |
Et ça fonctionne ! Pourtant quand je laisse la boucle for vide comme ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| EnsembleChaine creerEnsembleChaine(void)
{
EnsembleChaine this;
this->s=malloc(sizeof(char*)*SIZE_DEFAULT);
for(int i=0;i<SIZE_DEFAULT;i++)
{
this->s[i]=malloc(sizeof(char)*SIZE_DEFAULT);
for(int j=0;j<SIZE_DEFAULT;j++)
{
//this->s[i][j]='\0';
}
}
this->nb=0;
return this;
} |
Ça ne fonctionne plus et ça me déplace l'erreur de segmentation ici :
Code:
this->s[i]=malloc(sizeof(char)*SIZE_DEFAULT);
Du coup, je ne comprends pas ce qui ne va pas. En espérant une aide de votre part, car là j'en peux plus... Merci.
modifier la structure ou utiliser calloc ?
bonjour
j'ai une petite question: SIZE_DEFAUT*est-il constant (genre un #define SIZE_DEFAUT 20)?
Si oui, il est possible de modifier la structure comme suit et supprimer au passage creerEnsembleChaine...
Code:
1 2 3 4 5 6
|
struct EnsembleChaine
{
char s[SIZE_DEFAUT][SIZE_DEFAUT];
int nb;
}; |
Dans ce cas l'initialisation des structures peut se faire de cette façon
Code:
1 2 3
|
/* attention je suis un peu rouillé en C je ne sais pas si cette syntaxe est vallable */
struct EnsembleChaine ensembleCh = { { { 0,} , }, 0 }; |
Si l'utilisation de mémoire dynamique est un impératif ou imposé, tu peux regarder du coté de calloc à la place de malloc pour initialiser tes champs à 0 ( ou '\0').
un memset peut aussi faire l'affaire pour initialiser les éléments de ta structure une fois l'allocation terminée.