Segfault en C

Fermé
Tisiph0n3 - 16 nov. 2007 à 03:17
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 - 16 nov. 2007 à 23:44
Bonjour,
alors voila j'ai une fonction qui peux afficher un nb ds n'importe quel base prototypage
void my_put_nbr_base(unsigned int nbr, char *base)
il me faut la longueur de la chaine base donc j'ai une autre fonction
int my_strlen(char *str)
qui au passage a toujours fonctionné sans probleme, je compile donc un main qui appelle my_put_nbr_base
my_put_nbr_base(100, "012345678")
PAF segfault bouhouhou
bon ben gdb alors:
et c'est la ligne
base_len = my_strlen(base); de ma fonction my_put_nbr_base
qui fout la merde.
La question: PoUrQuOi? -_-'
jveux dire la fonction my_strlen a toujours marché nickel, elle prend un char* en paramètre et comme je lui passe une chaine de caractère à travers my_put_nbr_base pas de pb.
Et je l'ai déjà utilisé de ttes les manieres possibles et imaginables, jamais un segfault avec ça.
Donc si quelqu'un a une idée qu'il parle par pitié!
Merci :)

20 réponses

Bonjour,

Ce serait bien que vous nous expliquiez comment vous avez rempli la variable "base" dont vous cherchez la valeur. Sans cette information on ne peut pas vous répondre.

Manu
0
void my_put_nbr_base(unsigned int nbr, char *base)
donc
my_put_nbr_base(100, "012345678")
Voilà c'est tout , de plus je ne cherche pas sa valeur mais sa longueur...
Merci
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 nov. 2007 à 18:06
essaye avec un & quand tu appelle la fonction my_strlen(&base);
0
Erf ça change rien
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 nov. 2007 à 19:20
tu as bien declaré base_len comme un int ?
0
Oui base_len est déclaré en int
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 nov. 2007 à 19:46
poste ton programme en entier sa sera plus simple pour nous de t'aidé ;)
0
Bonjour,
désolé ça je ne peux pas ce que je peux te dire par contre c'est que la fonction my_put_str_base intervennait dans une autre fonction et qu'elle marchait très bien la seule chose que j'ai modifié c'est la condition du if() (fonction recursive) et quand elle faisait partie de l'autre fonction le 2e argument était du meme type rien n'a changé dans my_put_nbr_base, donc voila j'ignore totalement ce qui ne va pas de toute façon c'est base_len = my_strlen(base) qui segfault mais cette ligne est restée inchangée donc bon là c'est mystère de chez mystère
0
complément d'info j'ai essayé avec
base_len = my_strlen("012345678"); eh ben ça segfault toujours c'est a n'y rien comprendre....
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 nov. 2007 à 22:38
tu as fait une allocation de memoire pour base ?
0
non pas de malloc ça marchait à la base sans malloc donc bon mais je vais essayer
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 nov. 2007 à 22:57
oui essaye avec le malloc sinon le seul autre pobleme que je vois
c'est que a l'apel de la fonction my_strlen tu lui passe un pointeur au lieu de son adresse mais tu m'a dit que tu as toujours l'erreur avec le "&"...
0
bon ben ça a l'air de marcher en faisant
base = malloc(my_strlen(base) * sizeof(char));
base_len = my_strlen(base);
maintenant j'ai un floating exception car je divise nb par base_len et apparement base est vide malloc écrase t il les données de base ? Parce que base est affectée lors de l'appel de my_put_nbr_base .
De plus je comprends pas pk je dois faire un malloc n'est ce pas automatique quand les données sont passées a une fonction?
En plus my_strlen ne fait que parcourir la chaine voila son code:
int my_strlen(char *str)
{
int i;

i = 0;
while (str[i] != '\0')
{
i++;
}
return (i);
}
Donc logiquement ya pas besoin de malloc....
Je m'y perd
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 nov. 2007 à 23:13
juste avant d'affecter a base ces valeur tu fais
base = malloc(100) pour avoir au moins 100 case memoire disponible apres tu affecte a base ces valeurs
base ="328346454\0"
et la tu derais pouvoir utliser ta fonction my_strlen pour compter les caracteres
0
ah oui jme demandais pourquoi base = malloc (my_strlen(base)); ne segfault il pas? pourtant j'essaie de recuperer une longueur de chaine donc ça revient au mm :/
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 nov. 2007 à 23:05
sizeof(char) = 1 donc malloc (my_strlen*sizeof(char))= malloc(my_strlen)
0
oui ça je sais lol
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 nov. 2007 à 23:17
je pense que ta fonction my_strlen ne parcourait aucune chaine parce que la chaine base n'existait pas comme tu n'avais pas fait d'allocation memoire...
0
ok bon là c'est la mort j'ai une autre fonction my_putstr inutile d'expliquer a quoi elle sert je pense
et j'ai tout remis comme avant sans faire de malloc sur base alors ça donne
my_putstr(base);
base_len = my_strlen(base);
eh ben quand j'affiche base avant de regarder sa longueur ça segfault pas mais si je n'affiche pas base avant ça segfault, my_putstr ne fait aucun malloc elle est basée sur my_strlen :/ ça devient de plus en plus chelou cette histoire!
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 nov. 2007 à 23:27
avec tes petits bout de code c'est difficile de comprendre le probleme... ;)
0
Ah bah oui mais désolé mais de 1 le reglement de mon école m'interdit de foutre le moindre petit bout de code fait avec leur matos sur internet car ce code ne m'appartient pas meme si c'est moi qui l'ai écrit, de 2 le projet n'étant pas encore rendu je n'ai pas envie qu'un blaireau prenne mon code et qu'après ce soit moi qui soit suspecté de tricherie lors de la soutenance. Donc voila moi aussi j'aurais carrément preferé poser le code comme ça ça m'aurais evité de devoir tout expliquer ;),
Bref au final j'ai passé la fonction en itératif et plus de segfault, pas de malloc ni rien merci d'avoir essayé de m'aider...
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
16 nov. 2007 à 23:44
de rien ;)
0