Flux rss
Collection CommentÇaMarche.net
Rechercher : dans
Par :

[langage C] segmentation fault

Benja85, le jeudi 21 septembre 2006 à 00:14:05 
 Signaler ce message aux modérateurs

Bonjour !

Je sais que ce sujet a déjà été abordé dans des messages précédents, mais malgré ça j'arrive toujours à une erreur.

Mon programme est simplement la définition de strcpy :

char my_strcpy(char *s1, const char *s2)
{
s1 = (char *) malloc (sizeof s2);
int i;
for (i=0; s2[i] != '\0'; i++) s1[i] = s2[i]; s1[i]= '\0';

return *s1;
}

Je suis sur que le problème est vraiment trivial mais je débute en C, merci d'avance !

1

Char Snipeur, le jeudi 21 septembre 2006 à 08:32:21

Salut.
Je suis pas très calé en allocation de mémoire, mais je vais essayer de t'aider.
Je ne suis pas sur que sizeof s2 te donne la longueur de la chaine.
Tout d'abord, pour debugger, fait un printf de "sizeof s2" voir si cela correspond bien à la longueur de s2. Si oui, ne manquerai t'il pas une largeur de type ?
tu peux peut être remplacer sizeof s2 par strlen(s2).
Bonne chance Salutation !
Char Snipeur

Répondre à Char Snipeur

2

Benja85, le jeudi 21 septembre 2006 à 10:12:24

Sizeof (s2) me donne bien la longueur de s2 (avec le dernier char \0).

Le problème se situe ailleurs, ça doit être une histoire de pointeur mais je nage un peu pour le moment là dedans...

Répondre à Benja85

3

carkiasis, le jeudi 21 septembre 2006 à 21:53:23

Si tu travailles sous linux, tu peux utiliser ddd (je ne sais pas si ce prog existe aussi sous Windows). Cela te permettra de voir à quelle ligne se situe le segmentation fault...

Bon courage

Répondre à carkiasis

4

Char Snipeur, le vendredi 22 septembre 2006 à 08:49:52

Oula !
J'avais pas fait gaffe !
les s1[i] en dehors du for
à éviter.
vérifie sa valeur avant de l'utiliser, il est possible que le problème vienne de là Salutation !
Char Snipeur

Répondre à Char Snipeur

5

Char Snipeur, le vendredi 22 septembre 2006 à 08:56:27

Après test chez moi, en fait, il n'y a pas d'erreur.
Je pense donc que cela viens d'ailleur Salutation !
Char Snipeur

Répondre à Char Snipeur

6

Benja85, le vendredi 22 septembre 2006 à 09:57:24

Je me suis débrouillé finalement, en enlevant ce qui posait problème, j'arrive à un truc de ce genre :

char* my_strcpy (char* s1, const char* s2)
{
int i;
for (i=0; s2[i] != '\0'; i++) s1[i] = s2[i];

return s1;
}

Ainsi je ne me soucie plus du problème de l'allocation de mémoire.
Il est tout de même logique que avant d'appeler la fonction my_strcpy, il faut faire de la place, alors j'ai fais ca dans ma méthode main (pour les tests uniquement) :

char* src = "Tests";
char* dst = malloc(sizeof(src));
printf("%s\n", my_strcpy(dst, src));

Voilà tout simplement :) merci à vous !

Répondre à Benja85

7

tafiscobar, le vendredi 22 septembre 2006 à 10:26:54
  • +2

Salut, tout d'abord s2 est un pointeur sur un const char. Donc sizeof s2 te donne la taille du pointeur ie 4octets et non la taille de ta chaine (si c'est vrai, le compilateur n'est pas normé iso, ce n'est pas le comportement de sizeof sinon il n'y aurait pas de strlen).

Ensuite, si tu alloues de la mémoire dans la fonction my_strcpy, ben malloc te retourne un pointeur local et donc quand tu sors de ta fonction, ton pointeur local est perdu et donc d'ou le segmentation fault. Le malloc est fait par l'utilisateur et non dans la fonction strcpy.

Ensuite strcpy retourne le pointeur sur un char ie char* et non un char. Ta fonction devrait etre:

char*
my_strcpy (char* dest, const char* src) {
    int i;
    for (i = 0; src[i]!='\0'; ++i)
          dest[i] = src[i];
   dest[i] = '\0';
   return dest;
}
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!

Répondre à tafiscobar

8

Benja85, le vendredi 22 septembre 2006 à 22:18:00

Merci! Comme t'a vu + haut j'arrive au même résultat :p J'avais juste oublié de rajouter le dernier char \0 à ma destination.

Ca roule :p

Répondre à Benja85

9

mamiemando, le samedi 23 septembre 2006 à 11:21:51

L'erreur de segmentation était à mon avis plutôt dûe au fait qu'il fallait écrire :

char *dst = (char *) malloc(sizeof(char)*strlen(src));

Si ton my_strcpy retourne le char *, rien ne t'empêche de faire le free dessus à l'extérieur.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char*
my_strcpy (char* dest, const char* src) {
  int i;
  dest = (char *) malloc(sizeof(char)*strlen(src));
  for (i = 0; src[i]!='\0'; ++i) dest[i] = src[i];
  dest[i] = '\0';
  return dest;
}

int main(){
  char *src = "tapir",dst;
  my_strcpy(dst,src);
  printf("dst = %s\n",dst);
  free(dst);
  getchar(); // pour les windowsiens
  return 0;
}

Je n'ai pas testé mais ça doit marcher ça, non ?

Répondre à mamiemando

10

arth, le samedi 23 septembre 2006 à 11:46:22

En même temps essayer de retourner des chaines de caractères en c ca devient risqué ^^
Le loup, solitaire et mystérieux.

Répondre à arth

11

 mamiemando, le dimanche 24 septembre 2006 à 11:33:12

Je ne vois pas pourquoi. En fait de manière générale on essaye juste de mettre le calloc/malloc dans le même horizon que le free (ce qui n'est pas le cas de l'exemple que j'ai donné) et c'est pour ça que la version de tafiscobar est plus propre. Il faut juste avec sa version penser à allouer la chaine dest dans le main (et à la désallouer).

Répondre à mamiemando
[Langage C] C/C++ Erreur de segmentation Qu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux... www.commentcamarche.net/faq/sujet-4791-langage-c-c-c-erreur-de-segmentation
Langage C++ - Les types de données Les types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître... www.commentcamarche.net/contents/cpp/cpptype.php3
Langage C - Les types de données Les types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le... www.commentcamarche.net/contents/c/ctype.php3
Les files en langage CLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un... www.commentcamarche.net/faq/sujet-8282-les-files-en-langage-c
Les piles en langage CLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage... www.commentcamarche.net/faq/sujet-8283-les-piles-en-langage-c
Getchar() langage C (Résolu)Bonjour, je suis nouveau ne langage C et donc j'eprouve quelques difficulte : Je souhaiterai stocker le flux dentre que jentre au clavier pour cela je procede de la maniere suivante : #define BUFSIZE=4096; char buf[BUFSIZE]; printf("Enter your... www.commentcamarche.net/forum/affich-2960608-getchar-langage-c
Petit programme en langage C (Résolu)Bonjour, Etantdonné débutant en langage C, permettez moi S.V.P de vous adresser mon petit probléme que je n'arrive à comprendre la réponse: l'ennoncé de l'exercie: Écrire une fonction qui ne renvoie aucune valeur et qui détermine la valeur maximale et... www.commentcamarche.net/forum/affich-2811312-petit-programme-en-langage-c
Langage C pointeurs, creation de liste. (Résolu)Bonjour a tous. Voila, je rencontre quelaues petits preoblemes en langage C. Le but est de creer des fiches afin de creer une listes les contenant. Il faut ensuite afficher ce que l on a entre dans chaque fiche, puis afficher enfin le nombre de fiches... www.commentcamarche.net/forum/affich-2170245-langage-c-pointeurs-creation-de-liste
Introduction au langage CPetite histoire du C Le langage C a été mis au point par D.Ritchie et B.W.Kernighan au début des années 70. Leur but était de permettre de développer un langage qui permettrait d'obtenir un système d'exploitation de type UNIX portable. D.Ritchie... www.commentcamarche.net/contents/c/cintro.php3
Langage C++ - Les pointeursComme en langage C, le langage C++ permet d'utiliser des pointeurs pour manipuler des données, mais il introduit aussi le concept de référence, très pratique pour permettre la modification d'une donnée passée en paramètre d'une fonction. Définition... www.commentcamarche.net/contents/cpp/cpppoint.php3
Langage C - Les chaînes de caractèresQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne... www.commentcamarche.net/contents/c/cstring.php3