IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Segfault memcpy thread


Sujet :

Linux

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 65
    Par défaut Segfault memcpy thread
    Bonjour,
    ma fonction qui gere mes thread lance cette fonction pour rajouter un prefixe a ma var id
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    void RecupRes(char* id){
    	char* prefixe;
    	int i;
    	char* nomTable;
    	prefixe="prefixe";
    	i=strlen(id)+1;
    	char* test;
    	char* concat=(char*)malloc(sizeof(char)*(strlen(prefixe)+i));
    	char* concat2=(char*)malloc(sizeof(char)*(strlen(prefixe)+i));
    	concat=prefixe;
    	concat2=memcpy(concat,id,i);
    	printf("Nom table :[%s]\n",concat2);
    	if (concat!=NULL){
    		free(concat);
    		concat=NULL;
    	}
    	if (concat2!=NULL){
    		free(concat2);
    		concat2=NULL;
    	}

    Le problème est que j'ai une erreur de segmentation au niveau de memcopy valgrind me dit plus precisement
    Bad permission for mapped region at address ....
    Mais le error summary me dit 0 errors from 0 contexts
    Pourriez vous m'aider a resoudre ce probleme car je ne vois pas quoi faire pour mapped correctement

    En vous remerciant

    Omedo

  2. #2
    Membre émérite
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Par défaut
    Outch, ça pique.

    Tiens, regarde l'erreur Tu copies le pointeur. Du coup concat ne pointe plus vers la mémoire que tu as mallocé mais vers la chaîne constante "prefixe". Ensuite tu essayes d'écrire dedans, forcément ça segfault.

    De plus tu essayes d'écraser les premiers octets de "prefixe" au lieux de concaténer.

    Toujours très étrange :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    concat2=memcpy(concat,id,i);
    memcpy renvoie la valeur de son premier argument. Soit le pointeur concat. Du coup tu as concat2 = concat. Et donc à quoi sert le deuxième malloc ?

    Si tu veux juste te contenter d'afficher le nom de la table, tu peux faire :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Nom table :[%s%s]\n", prefix, id);

    Moi je te propose ce code qui me semble un peu moins le bazar.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void recup_res(const char *id) {
    	const char *pre = "prefix";
    	char *full_name = malloc(sizeof(char) * (strlen(pre) + strlen(id) + 1));
     
    	assert(full_name != NULL);
     
    	strcpy(full_name, pre);
    	strcat(full_name, id);
    	printf("Nom de la table : [%s]\n", full_name);
    	free(full_name);
    }
    Remarque les const, le test du malloc juste à son retour, l'utilisation de strcat à la place de strlen+memcpy. Et strcpy+strcat pour concaténer le préfixe et l'id.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 767
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Celelibi Voir le message
    Moi je te propose ce code qui me semble un peu moins le bazar.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void recup_res(const char *id) {
    	const char *pre = "prefix";
    	char *full_name = malloc(sizeof(char) * (strlen(pre) + strlen(id) + 1));
     
    	assert(full_name != NULL);
     
    	strcpy(full_name, pre);
    	strcat(full_name, id);
    	printf("Nom de la table : [%s]\n", full_name);
    	free(full_name);
    }
    Remarque les const, le test du malloc juste à son retour, l'utilisation de strcat à la place de strlen+memcpy. Et strcpy+strcat pour concaténer le préfixe et l'id.
    Pourquoi tout ça pour ça ???
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Nom de la table : [prefix%s]\n", id);
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre émérite
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Pourquoi tout ça pour ça ???
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Nom de la table : [prefix%s]\n", id);
    J'espère que son code était une version simplifiée et qu'il fait quelque chose d'autre de la chaîne préfixée.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 65
    Par défaut
    oui effectivement je faisais autre chose que l'afficher à l’écran
    j'avais trouver une autre solution mais la tienne est effectivement très intéressante

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Segfault] multi-thread et pthread_join()
    Par hidewak dans le forum C
    Réponses: 4
    Dernier message: 26/03/2013, 11h48
  2. Segfault update vbo dans thread
    Par Lintel-oo dans le forum OpenGL
    Réponses: 9
    Dernier message: 06/06/2012, 23h59
  3. Segfault a la fermeture d'un threads
    Par izissie dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 24/09/2010, 19h18
  4. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 10h00
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 14h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo