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

C Discussion :

Erreur de segmentation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 40
    Par défaut Erreur de segmentation
    Bonjour

    J'ai un petit souci dans un programme en C. Je veux passer un tableau à deux dimensions (char**) à une fonction qui lui alloue dynamiquement de la mémoire, mais lorsque j'essaie de lire dans ce tableau via une autre fonction, ou par le main, il me donne un erreur de segmentation.

    A noté que je dois passer les tableaux aux fonctions par référence...

    Voici le code :
    Fichier du main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdio.h>
    #include "fonctions.h"
    #define TAILLEG 10
     
     
    int main(){
    	int i,j;
    	char **tabJ1Bat;
     
    	initTab(tabJ1Bat, TAILLEG);	
    	//il semble que l'erreur vienne de l'appel à cette fonction   
    	affTab(tabJ1Bat, TAILLEG);
     
    	return 0;
    }

    Fichier des fonctions

    Code : 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
    22
    23
    24
    25
    26
    27
    28
    29
    #include <stdlib.h>
    #include <stdio.h>
    #define EAU '~'
     
    void initTab(char **tab, int taille){
    	int i,j;
    	tab = (char**) calloc (taille,sizeof(char*));
    	for(i=0;i<taille;i++)
    	{
    		tab[i]=(char*)calloc(taille,sizeof(char));
    		for(j=0;j<taille;j++)
    		{
    			tab[i][j] = EAU;
    		}
    	}
    }
     
    void affTab(char **tab, int taille){
    	int i,j;
    	char car;
    	for(i=0;i<taille;i++)
    	{
    		for(j=0;j<taille;j++)
    		{
    			car = tab[i][j];
    			printf("%c",car);
    		}
    	}
    }

    Merci d'avance de votre aide!

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Les paramètres d'une fonctions sont transmis par copie.
    Si tu veux que ta fonction modifie un élément, il faut lui transmettre un pointeur sur cet élément. Ainsi si tu veux que ta fonction modifie un char **, il faut lui passer un char ***.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2012
    Messages : 82
    Par défaut
    Bonjour,

    A noter qu'une autre solution est possible si tu paramètres ta fonction en char ** et non en void.
    Après tu n'as plus qu'à retourner le double tableau que tu as alloué. Et évidement de le récupérer dans une variable adaptée.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pour expliciter ce que dit DrDarko , le plus simple est de récupérer ta variable locale tab par le retour de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char ** initTab(int taille){
    	int i,j;
    	char ** tab = (char**) calloc (taille,sizeof(char*));
             if(tab != NULL){
    .....
             }
             return tab;
    ....
    char ** tabJ1Bat = initTab(TAILLEG);

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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