Erreur de Segmentation (Core Dumped)
Résolu/Fermé
Celebrations
-
16 déc. 2015 à 16:55
mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 - 17 déc. 2015 à 10:35
mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 - 17 déc. 2015 à 10:35
A voir également:
- Erreur de segmentation c
- Erreur de segmentation (core dumped) ubuntu - Meilleures réponses
- Erreur de segmentation en c - Meilleures réponses
- Erreur 0x80070643 - Accueil - Windows
- Erreur de segmentation (core dumped) ✓ - Forum Programmation
- Une erreur s'est produite instagram ✓ - Forum Instagram
- Open core legacy patcher - Accueil - MacOS
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
1 réponse
mamiemando
Messages postés
33432
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
16 décembre 2024
7 809
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.