2010-11-22 7 views
1

Je vais copier les lignes concernées:Segmentation Fault après un peu modifier mon code

(Déclarations)

typedef struct { /* per una entrada de la taula de posicion */ 
    int f; 
    int c; 
} pos; 
pos *p_opo[9]; 

(en principal)

for (i = 0; i < num; i++) { 
     p_opo[i] = (pos *) calloc(n_fil * n_col/2, sizeof (pos)); 
    } 

Maintenant, après seulement avoir introduit cette lignes, le code casse en un point arbitraire (dans un appel à une fonction de bibliothèque donnée). Je soupçonne que je corrompt quelque chose avec ça, même si je ne sais pas quoi.

Tout ce que je veux, c'est avoir un tableau de tableaux de taille variable!

PD: num est un argument du programme. Je l'ai couru avec num = 1 de toute façon.

+0

Qu'est-ce que 'num' ?? – EboMike

+0

A édité le message. num est un argument du programme. Je l'exécute avec num = 1 en ce moment et obtenir l'erreur. – bluehallu

+0

si num <= 9, je ne vois aucun problème avec ce que vous avez écrit. Que voulez-vous dire par "le code rompt sur un point arbitraire"? – steabert

Répondre

2

num doit être inférieure ou égale à 9. (0..8 pointeurs attribués à p_opo est égal à 9!)

Notez que dans C que vous obtenez des erreurs dans un autre lieu en cas de fuites de mémoire, etc. La raison en est que, en changeant du code, d'autres codes ou données peuvent être réarrangés et cela peut aboutir à des erreurs de segmentation. Donc, le problème peut très bien être dans une autre partie de votre programme. Assurez-vous d'avoir tous vos avertissements activés (comme l'option -Wall dans gcc), cela peut vous donner quelques indices.

+0

num = 1 pour mes tests. C'est exactement ce que je veux dire par "casser dans un point arbitraire". J'ai déjà activé l'option -Wall. Pas d'erreur ni d'avertissement lors de la compilation ... – bluehallu

+0

@Hallucynogenyc Exécutez votre programme depuis gdb. Lorsque vous obtenez une erreur de segmentation, utilisez la commande 'bt' (backtrace) pour déterminer où les choses vont mal. – Roalt

+0

aucun gdb installé, je ne peux pas non plus l'installer. lire ci-dessus pour savoir pourquoi. – bluehallu

1

Si votre appel à calloc demande une mémoire de taille 0, il peut renvoyer NULL, et si vous utilisez cette mémoire, cela peut provoquer l'erreur de segmentation. Donc, si:

0 == (n_fil * n_col/2) 

ou en quelque sorte

0 == sizeof (pos)   /* I don't think that this is possible */ 

la taille de la mémoire que vous demandez est 0, et ainsi calloc peut retourner NULL.

Si ce n'est pas le cas, je ne pense pas que vous ayez assez de code pour que quelqu'un sache pourquoi il se sépare. Vous devez garder à l'esprit que des erreurs de ce type peuvent passer inaperçues jusqu'à ce que vous ajoutiez ou modifiez du code qui semble n'avoir aucun rapport avec le code qui contient l'erreur réelle.

0

Vous voyant suspendre le retour de calloc me rend suspect. Ne faites pas cela, cela conduit à une erreur typique si vous oubliez l'inclure pour la fonction du système.

Cela se produit si vous êtes sur une machine avec des pointeurs 64 bits et 32 ​​bits int.

+0

a tenté de supprimer la distribution. La même erreur :( – bluehallu

+0

@Hallucynogenyc: Bien sûr, sans la distribution, vous avez la même erreur, l'idée est que sans cela, tout compilateur décent devrait vous donner un avertissement franc. Je suppose que vous compilez avec '-Wall' ou quelque chose comme ça? –

+0

Cela veut dire que je peux garder le casting en toute sécurité là où il était? – bluehallu

Questions connexes