Erreur de segmentation (core dumped)

spomix Messages postés 2 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 3 novembre 2007 - 2 nov. 2007 à 21:03
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 - 3 nov. 2007 à 01:51
Bonjour,
Je suis nouveau sur le forum et nouveau egalement en programmation "C", et depuis une semaine j'ai un probleme avec ce code qui m'affiche cette erreur a chaque fois que je veux l'executer:
"Erreur de segmentation (core dumped)"
La compilation se passe sans erreur mais l'execution ne marche pas.
C'est la fonction "**decompose_mot" qui ne marche pas sinon les autres fonctionnent car je les ai testé un par un. Cette fonction doit decomposé une phrase en un tableau de caractères.

Egalement, je voudrais savoir où est-ce que je pourrai trouver une bonne explication sur les pointeurs (de type: **pointeur) et structures car je ne comprends pas ces deux elements du tout.
 
# include <stdio.h>
# include <stdlib.h>

/* Fonction qui compte le nombre de 
   caractère de la chaine passé en argument*/
int compte_caract(char * chaine)
{
  int i=0;
  while(chaine[i]!='\0')
    i++;
  return i;
}

/* Fonction qui compte le nombre de 
   mot de la chaine passé en argument*/
int compte_mot(char *chaine)
{
  int i,j,mot=0;
  i=compte_caract(chaine);
  for(j=0;j<=i;j++)
    {
      if(chaine[j]==' ')
    {
      mot++;
    }
    }
  return mot+1;
}

/* A REVOIR
   Fonction qui decompose une cahine de caractère en un tableau
   de caractère.*/
char **decompose_mot(char *chaine)
{
  char **tab;
  int i,j,a,b,k=0;
  i=compte_mot(chaine);
  tab=(char **)malloc(i*sizeof(char*));
  for(a=0;a


Yacouba
A voir également:

4 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
2 nov. 2007 à 23:37
On n'est pas en VB là...

char** tab=(char **)malloc(i*sizeof(char*));

Ceci alloue un tableau de pointeurs et en aucun cas la zone mémoire pointée par ces pointeurs, qui ne sont d'ailleurs pas utilisés => plantage, tu essaye d'écrire dans une zone réservée. Ce qu'il faudrait faire serait plutôt :
char** tab=(char **)malloc(i*sizeof(char*));
for(j=0;jtab=(char **)malloc(i*sizeof(char*));
char* pTemp=(char*)malloc(i*N_MAXCHAR*sizeof(char));
for(j=0;j
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
2 nov. 2007 à 23:38
Pardon :
Après tu pourras stocker dans tab[x] une chaîne de taille max. MAXCHAR.
0
spomix Messages postés 2 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 3 novembre 2007
3 nov. 2007 à 00:35
Merci beaucoup,

Mais mon probleme probleme est que je ne comprends pas trop l'utilisation de malloc ainsi des pointeurs.

Je dois ecrire dans un tableau à deux dimenssions et ca ne marche toujours pas car j'ai ce message d'erreur:
"test.c:46: attention : assignment makes integer from pointer without a cast"

tab[a][b]=(char*)malloc(i*sizeof(char));
tab[a][b]=chaine[k];

Yacouba
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
3 nov. 2007 à 01:51
malloc sert à allouer une zone de mémoire de la taille précisée, peu importe ce que tu va mettre dedans.
Un pointeur est en gros une adresse mémoire; ainsi un pointeur sur une chaîne (char* par ex.) est l'adresse du premier élément.

Pour un tableau à deux dimensions c'est plus compliqué : type char**, soit un pointeur sur une zone de mémoire contenant des pointeurs sur des chaînes de caractères. Quand tu le déclares sur la pile (par ex. char pBuffer[2][3]), tu n'as pas de problème car le compilateur s'en occupe tout seul. Mais quand tu le déclares en dynamique, tu dois initialiser tous les pointeurs pour qu'ils référencent une zone de mémoire, comme je te l'ai mis dans le post précédent.

Dans ton exemple là, tab est de type char** donc tab[a] de type char* et tab[a][b] de type char; je ne vois pas trop ce que tu veux en faire mais si tu veux faire de tab un tableau de chaînes tu peux faire char* tab[n]; il faut que tu initialises chaque élément après...soit avec de la nouvelle mémoire (malloc), soit tu les fait pointer sur une chaîne déjà existante.
Encore un truc pour copier une chaîne il suffit pas de faire : a=b (avec des char* du moins) il faut utiliser une fonction de copie genre strcpy.
0
Rejoignez-nous