Juste un soupçon sur l'aide Dépanner. J'espère que cela aidera les futurs lecteurs qui sont nouveaux pour les pointeurs.
Une meilleure façon de résoudre un problème de segmentation est de l'exécuter avec un débogueur tel que gdb
.
par exemple compiler votre programme avec gdb (Vous devez GDB installé sur votre hôte)
gcc -ggdb Test.c -o Test
Lancez ensuite avec gdb
gdb ./Test
Dans votre cas, vous verrez une sortie comme celui-ci . Cela va à l'invite gdb
. Ensuite, tapez run
ou r
, il exécutera le programme. Ensuite, il demande une entrée. Tapez votre valeur d'entrée. Ensuite, l'erreur de segmentation se produit. Vous pouvez maintenant voir votre backtrace en tapant backtrace
ou bt
. Vous pouvez voir quelle ligne provoque votre accident. Vous pouvez voir le code par list
. Vous pouvez accéder à n'importe quelle ligne en tapant list <line>
. Passez par un GDB Guide pour découvrir plus de commandes.
Il essaie d'accéder à un pointeur, probablement invalide, c'est pourquoi il plante. Ensuite, découvrez pourquoi c'est invalide. Vous ne l'avez probablement pas initialisé ou n'avez pas alloué de mémoire. Donc la solution la plus simple serait de le déclarer comme un tableau (plutôt qu'un tableau de pointeurs) comme @Andrewjs mentionné dans sa réponse.
Reading symbols from /tmp/Examples/Test...done.
(gdb) run
Starting program: /tmp/Examples/Test
for 1
for 2
10
Program received signal SIGSEGV, Segmentation fault.
0x005c5c3d in _IO_vfscanf_internal (s=0x6d1420, format=0x804867e "%s", argptr=0xbfffe984 "\020\204\004\b", errp=0x0) at vfscanf.c:840
840 *str++ = c;
(gdb) backtrace
#0 0x005c5c3d in _IO_vfscanf_internal (s=0x6d1420, format=0x804867e "%s", argptr=0xbfffe984 "\020\204\004\b", errp=0x0) at vfscanf.c:840
#1 0x005cebbb in __scanf (format=0x804867e "%s") at scanf.c:35
#2 0x0804850d in main() at Test.c:16 <-- Your program's last call
(gdb) list
835 }
836 #else
837 /* This is easy. */
838 if (!(flags & SUPPRESS))
839 {
840 *str++ = c; <-- Crash point
841 if ((flags & MALLOC)
842 && (char *) str == *strptr + strsize)
843 {
844 /* Enlarge the buffer. */
(gdb)
Pour le débogage d'applications avant This may help
Étape 1: Que dit votre débogueur? – tadman
Indice: Vos tampons de caractères 'a' ne sont jamais initialisés, alors où' scanf' met-il ces données? Probablement à un endroit de pointeur aléatoire et de faire exploser votre programme. – tadman
Autre indice: vous avez besoin d'une ligne 'a [y] [p] = malloc (X);' juste avant 'scanf ("% s ", a [y] [p]);', où 'X' est le longueur de la chaîne à lire plus 1. – DyZ