2017-07-19 4 views
2

Je suis donc confronté à un problème étrange. Lorsque je déclare un int qui n'est pas utilisé par la suite, j'obtiens une erreur de segmentation. Lorsque je supprime la déclaration, le code fonctionne parfaitement. Comment se peut-il?Erreur de segmentation impliquant une variable inutilisée

FILE* ptr = fopen("prueba.txt", "r"); 
int x; 
char* a; 
int y = 0; //this cause the seg fault. 
do{ 
    while (fscanf(ptr, "%i", &x)!=-1){ 
     fscanf(ptr, "%s", a); 
      printf("%i %s ",x, a); 
    } 
    fseek(ptr, 0, SEEK_SET); 
}while(1); 


fclose(ptr); 
} 

Mais même si je l'utilise, dire avec y++;, après printf je reçois toujours une erreur de segmentation.

+0

fscanf (ptr, "% s", a); Cela ressemble au problème. a n'est pas mallocé – CIsForCookies

+2

'fscanf (ptr,"% s ", a);' écrase la mémoire aléatoire. En ajoutant une variable, vous changez la mémoire aléatoire sur laquelle elle se trouve. – Art

+0

@Art, trop mauvaises réponses courtes sont permises aux commentaires. Si vous pouvez obtenir votre réponse dans la section Réponses, cela évitera que cette question apparaisse dans la section "Sans réponse" pour toujours. – CDahn

Répondre

5

après printf Je reçois toujours des seg. faute.

Eh bien, erreur de segmentation peut être causée par la cause A et se faire attraper seulement après un certain temps.

cette ligne: fscanf(ptr, "%s", a) lit la chaîne en a sans affecter d'abord la mémoire -> UB.

L'UB est appelée uniquement à printf. Fixer le a avec a=malloc(SOME_SIZE) ou char a[SOME_SIZE] et cela devrait aller

1

Vous devez initialiser votre pointeur vers un char, char *a, en utilisant calloc ou malloc fonctions. Vous pouvez également utiliser des tableaux avec une durée de stockage automatique comme char a[20];.

Dans votre code, vous passez le pointeur dans uninitialized fscanf() signifie effectivement que fscanf() va écraser une zone non définie de mémoire.

+1

* utilise stack-assigned * ce serait mieux si vous changez les mots pour "utiliser des tableaux avec une durée de stockage automatique". –