Erreur de Segmentation (Core Dumped)
Résolu/Fermé
Celebrations
-
16 déc. 2015 à 16:55
mamiemando Messages postés 32651 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 septembre 2023 - 17 déc. 2015 à 10:35
mamiemando Messages postés 32651 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 septembre 2023 - 17 déc. 2015 à 10:35
A voir également:
- Erreur de segmentation (core dumped) ubuntu
- Segmentation fault (core dumped) - Meilleures réponses
- Erreur de segmentation (core dumped) c - Meilleures réponses
- Segmentation fault (core dumped) ✓ - Forum Programmation
- Erreur de segmentation (core dumped) - Astuces et Solutions
- Core temp - Télécharger - Divers Utilitaires
- Iptv erreur de lecture - Forum Vidéo/TV
- Youtube une erreur s'est produite ✓ - Forum YouTube
1 réponse
mamiemando
Messages postés
32651
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 septembre 2023
7 659
Modifié par mamiemando le 16/12/2015 à 17:45
Modifié par mamiemando le 16/12/2015 à 17:45
Bonjour,
Cette erreur est normale, et tu peux voir en lançant ton programme avec un débogueur (par exemple
Ton erreur vient de la manière dont tu alloues ta matrice et la manière dont tu accèdes à la case (i, j) :
1) une matrice de dimension (m, n) a exactement m * n cases, où m est le nombre de lignes et n le nombre de colonnes : fondamentalement tu n'as donc pas alloué la bonne quantité de mémoire ave ton
2) un seul
Il faut donc faire un choix :
1) soit tu alloues bien m * n cases dans un seul vecteur, et ton coefficient (i, j) est accessible via le calcul :
2) soit tu alloues un tableau de ligne, et chaque ligne de ta matrice :
Bonne chance
Cette erreur est normale, et tu peux voir en lançant ton programme avec un débogueur (par exemple
gdbsous linux) que cette erreur survient quand tu evalue arr[i][j] :
gcc -g programme.c -o executable
gdb ./executable
r
bt
Ton erreur vient de la manière dont tu alloues ta matrice et la manière dont tu accèdes à la case (i, j) :
1) une matrice de dimension (m, n) a exactement m * n cases, où m est le nombre de lignes et n le nombre de colonnes : fondamentalement tu n'as donc pas alloué la bonne quantité de mémoire ave ton
malloc.
2) un seul
mallocrevient à allouer un tableau 1D, aussi complexe soit le calcul fait dans le malloc. Si tu as alloué n cases de type T et que tu manipules l'adresse de ce tableau, celui ci est indexé de 0 à n-1 inclus. Donc si tu as alloué m * n cases, tu accèdes aux différents éléments avec les valeur de 0 à ((m * n) - 1)
Il faut donc faire un choix :
1) soit tu alloues bien m * n cases dans un seul vecteur, et ton coefficient (i, j) est accessible via le calcul :
matrice[n*j + i], quitte à définir une fonction du genre :
typedef int * matrice_t; int matrice_get(matrice_t matrice, unsigned i, unsigned j) { return matrice[n*j + i]; } int ** matrice_create(unsigned m, unsigned n) { return malloc(m * n * sizeof(int)); } void matrice_free(matrice_t matrice) { free(matrice); }
2) soit tu alloues un tableau de ligne, et chaque ligne de ta matrice :
typedef int ** matrice_t; int matrice_get(matrice_t matrice, unsigned i, unsigned j) { return matrice[i][j]; } int ** matrice_create(unsigned m, unsigned n) { unsigned i, j; int ** matrice = malloc(m * sizeof(int *)); for(i = 0; i < m; ++i) { matrice[i] = malloc(n * sizeof(int)); } return matrice } void matrice_free(matrice_t matrice) { for(i = 0; i < m; ++i) { free(matrice[i]); } free(matrice); }
Bonne chance
16 déc. 2015 à 17:50
17 déc. 2015 à 10:35
Je profite de ce fil de discussion pour souligner quelques points fondamentaux sur les pointeurs, et qui sont généralement très mal expliqués (selon moi).
Les tableaux en C sont une "illusion". Ce n'est qu'un jeu d'écriture, car en fait, tout est adresse mémoire et la machine ne raisonne que comme ça, il n'y a pas de notion de tableau a proprement parlé (par opposition par exemple aux du C++).
En réalité, signifie : à partir de l'adresse de , on se décale de cases, la taille d'une case étant déterminée par le type du pointeur.
En particulier, . Et revient à se placer juste après cette première "case", c'est-à-dire sur le second élément du tableau. On comprend dès lors pourquoi en C les "tableaux" sont "indexés" à partir de 0.
Ainsi, si mon pointeur est un se décaler de cases revient à se décaler de .
Si on regarde la deuxième version de matrice que je te proposais, on voit que ce peut tout à fait lui même être un type de pointeur, car une pointeur n'est qu'une adresse et à donc une taille bien connue (32 bits sur une architecture 32 bits, 64 sur une architecture 64 bits). Ça donc du sens d'utiliser un opérateur sur un ("tableau" qui stocke des adresses de type ).
Par contre, ça n'a pas de sens d'appliquer cet opérateur sur un pointeur : ce type est utilisé pour désigner une adresse générique, mais on ne connaît pas la nature (et donc la taille) de l'objet ainsi référencé. Il est dès lors impossible de donner un sens à , donc à , et donc a fortiori à . C'est pourquoi l'opérateur et ne peut pas être appliqué à un tel pointeur.