Partage
  • Partager sur Facebook
  • Partager sur Twitter

Segmentation fault: 11

allocation de mémoire à un tableau à double dimension

    11 juin 2021 à 18:20:48

    Bonjour, j'ai une erreur(voir ci dessus) que j'arrive à résoudre pouvez vous m'aider:

    #include <stdio.h>
    #include <stdlib.h>
    
    int TX = 0,TY = 0;
    int **PLATEAU;
    
    void init_table(int *x, int *y, int xd, int yd, int **plateau) {
    	*x = xd;
    	*y = yd;
    
    	(**plateau) = (int)malloc((*y) * sizeof(int));
    	for (int i = 0; i < (*y); ++i)
    	{
    		plateau[i] = malloc((*x) * sizeof(int));
    	}
    }
    
    int main(int argc, char const *argv[])
    {
    	init_table(&TX, &TY, 5, 5, PLATEAU);
    	return 0;
    }

    merci

    -
    Edité par TheSmiley 11 juin 2021 à 18:22:03

    • Partager sur Facebook
    • Partager sur Twitter
      11 juin 2021 à 20:13:37

      Bonjour ! Qu'est sensée faire la ligne 11 ? Je ne suis pas spécialiste des pointeurs, mais j'ai toujours mis un pointeur à gauche d'un appel à 'malloc', pas toi ?

      • Partager sur Facebook
      • Partager sur Twitter
        11 juin 2021 à 21:35:48

        Bonjour,

        Ah, les pointeurs! Je parie que le prototype de init_table() t'a été imposé! Ah, les profs!

        Ligne 7, il ne faut pas être radin et mettre le bon nombre d'étoiles devant plateau (et en l'appelant adr_de_plateau ça serait plus lisible, voir ma ligne au sujet de PLATEAU)
        Ligne 11, bien vu il faut mettre des étoiles devant adr_de_plateau. Mais arrêtons nous au juste nombre.
        Ligne 11 encore, ce que tu veux allouer ce sont Y pointeurs donc, il faut en réserver : Y x tailleDUnPointeur.
        Ligne 14. En l'appelant adr_de_plateau, on peut plus facilement trouver la syntaxe (*adr_de_plateau)[i]
        Ligne 22.
        - Tu veux mettre à jour TX, donc tu passes son adresse
        - tu veux mettre à jour TY, donc tu passes son adresse
        - tu veux mettre à jour PLATEAU, donc ...

        Et le compilateur est là pour t'aider, il voit quand les types ne correspondent pas et te le signale par des warnings.

        • Partager sur Facebook
        • Partager sur Twitter

        En recherche d'emploi.

          12 juin 2021 à 8:48:55

          comme ça :

          #include <stdio.h>
          #include <stdlib.h>
          
          int TX = 0,TY = 0;
          int **PLATEAU;
          
          void init_table(int *x, int *y, int xd, int yd, int **plateau) {
          	*x = xd;
          	*y = yd;
          	int s = 5;
          
          	(**plateau) = (int*)malloc((*y) * sizeof(int*));
          	for (int i = 0; i < (*y); ++i)
          	{
          		plateau[i] = malloc((*x) * sizeof(int));
          	}
          }
          
          int main(int argc, char const *argv[])
          {
          	init_table(&TX, &TY, 5, 5, PLATEAU);
          	return 0;
          }

          EDIT: CA MARCHE : À LA LIGNE 12 IL NE FALLAI METTRE  AUCUNE ÉTOILE !!!!!!!!:magicien:

          ET AUSSI À LA LIGNE 6 IL NE FALLAIT METTRE Q'UNE ÉTOILE

          mais il y a un autre SEGMENTATION FAULT:11:

          #include <stdio.h>
          #include <stdlib.h>
          
          int TX = 0,TY = 0;
          int** PLATEAU;
          
          void init_table(int *x, int *y, int xd, int yd, int **plateau, int val) {
          	*x = xd;
          	*y = yd;
          	int s = 5;
          
          	plateau = malloc(yd * sizeof(int*));
          	for (int i = 0; i < (*y); ++i)
          	{
          		plateau[i] = NULL;
          		plateau[i] = (int*)malloc(xd * sizeof(int));
          		if(plateau[i] == NULL){
          			exit(EXIT_FAILURE);
          		} 
          		for (int xa = 0; xa < (*x); ++xa)
          		{
          			plateau[i][xa] = val;
          		}
          	}
          }
          
          
          
          int main(int argc, char const *argv[])
          {
          	init_table(&TX, &TY, 5, 5, PLATEAU, 0);
          	printf("%d\n", PLATEAU[1][1]);
          	return 0;
          }

          cela vient du printf dans le main: si je mets entre commentaires le printf il y a plus de segmentation fault!

          -
          Edité par TheSmiley 12 juin 2021 à 9:33:34

          • Partager sur Facebook
          • Partager sur Twitter
            12 juin 2021 à 10:20:49

            AntoineBarbier12 a écrit:

            EDIT: CA MARCHE : À LA LIGNE 12 IL NE FALLAIT METTRE  AUCUNE ÉTOILE !!!!!!!!:magicien:

            Pas fausse joie ! Active les Warning ! Tu n'as pas suivie les conseils de Dalfab !

            Je ne sais pas quel est le but de ton code, mais il est vraiment bancal ! C'est tellement bancal qu'on ne sait même pas par quel bout y prendre.

            malloc retourne l'adresse de l'allocation mémoire, normalement on la stocke dans un pointeur, or toi tu la stocke dans un entier (vu que tu déréférence le pointeur). entre parenthèse on ne cast (transtype) pas le retour de malloc ! 

            Il ne faut pas oublier que les paramètres de fonction sont passés par copie aux fonctions (le paramètre est une variable locale à la fonction qui reçois une copie de la valeur passé en argument). Donc pour que la fonction modifie la variable envoyé à la fonction on envoi son adresse (comme tu as fait pour TX et TY) C'est aussi valable pour les pointeurs qui sont des variables comme les autres, à la différence qu'il sont censé stocker des adresses.

            Quelques remarque : Tes variables globales sont complètement inutiles (elles devraient être déclarées dans la fonction main). On évite les noms de variable en MAJUSCULES, on réserve cela aux macros.


            Pour ton erreur sur le printf, ça vient de ce que ton pointeur TABLEAU n'a pas été modifié et ne pointe sur aucun tableau pour les raisons que je t'ai expliqué plus haut !

            -
            Edité par rouloude 12 juin 2021 à 10:26:09

            • Partager sur Facebook
            • Partager sur Twitter
              13 juin 2021 à 12:52:17

              AntoineBarbier12 a écrit:

              CA MARCHE : À LA LIGNE 12 IL NE FALLAI METTRE  AUCUNE ÉTOILE !!!!!!!!:magicien:

              Et non, surtout pas.

              AntoineBarbier12 a écrit:

              ET AUSSI À LA LIGNE 6 IL NE FALLAIT METTRE Q'UNE ÉTOILE

              Non plus, tu t'éloignes de la solution. Tu veux modifier un tableau de pointeurs sur des entiers. Il faut donc 3 étoiles.

              AntoineBarbier12 a écrit:

              mais il y a un autre SEGMENTATION FAULT :11:

              Donc ça ne marche pas. La fonction n'a pas du tout rempli le tableau attendu.

              Si tu t'ennuies tu peux lire ce que je t'ai proposé. 

              • Partager sur Facebook
              • Partager sur Twitter

              En recherche d'emploi.

                14 juin 2021 à 9:58:40

                Quand ça plante on prend un debugger et on regarde où ça a planté, on ne s'amuse pas à deviner ni à poster sur un forum que quelqu'un devine à ta place. Active aussi les warnings ça aide.

                Quand après ça tu n'arrives toujours pas à résoudre le problème ni la cause, alors dans ce cas tu peux poser la question.

                Lien intéressant pour savoir comment poster une bonne question sur un forum : https://www.biostars.org/p/75548/

                Concernant ton code, il y a tellement rien qui va qu'il serait fastidieux de tout énumérer. Je te recommande de recommencer à lire un cours sur les pointeurs et le passage en paramètre. Note aussi que les double pointeurs sont une réelle plaie à manipuler et une source de problème intense.

                -
                Edité par markand 14 juin 2021 à 10:00:35

                • Partager sur Facebook
                • Partager sur Twitter

                git is great because Linus did it, mercurial is better because he didn't.

                  14 juin 2021 à 12:49:41

                  markand a écrit:

                  Lien intéressant pour savoir comment poster une bonne question sur un forum : https://www.biostars.org/p/75548/

                  Il y a aussi le classique http://www.catb.org/esr/faqs/smart-questions.html par Eric Steven Raymond (dont l'auteur de l'article que tu proposes indique s'être inspiré).

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Segmentation fault: 11

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown