Segfault lors de la modification de char*

Fermé
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 - 14 avril 2013 à 05:14
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 - 14 avril 2013 à 23:19
Bonjour,

Je viens d'intégrer epitech en rentrée décalée, et je débute donc en C.

Je cherche, pour mon projet en cours (une calculatrice à nombre infinis), à réécrire la fonction str_replace qui existe en PHP.

Pour cela, je voudrais modifier ma chaine de caractères pour la première occurence de la chaine cherchée, puis recommencer tant que ma chaine de caractères source est différente de la chaine retournée en rappellant la fonction avec les nouveaux arguments qui vont bien.

Là est mon problème, je n'arrive pas à donner à ma variable d'entrée la valeur de ma variable de sortie, mon programme segfault dés que je cherche à ecrire quoi que ce soit dedans. :/

J'ai essayé d'isoler le problème, et il semblerait que je ne puisse pas appeller deux fois ma fonction de copie de contenu de variable.

Voici mon code simplifié :

char	*str_copy_str_replace(char *dest, char *src)
{
  int	x;
  char	*out;

  printf("a\n");
  out = src;
  x = 0;
  printf("b\n");
  while (src[x] != '\0')
    {
      printf("z\n");
      dest[x] = src[x]; //segfault ici
      x++;
    }
    dest[x] = '\0';
  return (dest);
}

int	main()
{
  char	*str0;
  char	*str1;
  char	*str2;

  str0 = "ceci est un test, un test !";
  str1 = str_copy_str_replace(str1, str0);
  printf("%s\n", str1);
  str2 = str_copy_str_replace(str2, str0); // segfault ici
  //str_replace("un test", "plutot concluant", str1, str2);
  printf("%s\n", str2);
}


Je ne comprend pas pourquoi je segfault ici, mais pas lors du premier appel de ma fonction, seulement au deuxième.

Pouvez vous m'expliquer, s'il vous plait, pourquoi ça ne fonctionne pas ?

Attention cependant, pour des raisons pédagogique, j'aimerais si possible que vous ne me donniez pas de code corrigé, j'aimerais corriger moi même. =)

Merci d'avance =)

2 réponses

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
14 avril 2013 à 10:44
Bonjour, str1 et str2 sont "vide" ces pointeurs en l'état ne peuvent pas être utilisés comme des tableaux de char.
dest[x] = src[x]; //segfault ici
dest ne pointant pas sur une adresse valide créé le segfault en voulant écrire des données " n'importe où ".
donnez une adresse valide à str1 et 2, pouvez utiliser malloc :
str1 = malloc(sizeof(char)*100);
0
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 1 101
14 avril 2013 à 15:26
Merci =)

En effet, avec du malloc, ça marche tout de suite mieux :)

Sait tu pourquoi ma fonction str_copy fonctionnait au premier appel quel que soit l'ordre de mes variables ?
0
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 14/04/2013 à 20:02
Je ne sais pas normalement ça ne doit pas fonctionner du moins jusqu'à dest[x] = src[x]; arrivé là ça 'devrait' planter du premier coup.
char *str;
char *chaine = "une chaine";
maintenant si on fait :
str[4] = chaine[4];

ok pour chaine car initialisé avec une chaine de plus de 5 char, contient alors l'adresse du début de la chaine, chaine[4] retourne la valeur à l'adresse chaine+4 qu'on pourrait écrire *(chaine+4)
mais pas ok pour str qui est un pointeur non initialisé et faire str[4] c'est faire *(str+4) on va essayer de lire (enfin ici on va essayer d'ecrire) à l'adresse str+4 hors str ne contient pas une adresse valide, il peut contenir NULL ou n'importe quel valeur tant qu'il n'est pas initialisé du coup faire str[4] c'est essayez de lire quelque part où il ne faut pas et c'est pourquoi ça doit planter.
0
Templier Nocturne Messages postés 7734 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 21 mai 2016 1 101
14 avril 2013 à 23:19
mouais, c'est louche tout ça :/

Finalement je vais recoder ma fonction depuis le début en appliquant ce que tu me dit, ça devrait mieux marcher que de bricoller en mettant des mallocs à l'arrache ^^

merci, je te tiens au courant ;)
0