2012-05-05 2 views
1

Ceci est mon code:c segfault due à un mauvais pointeur

#include <stdio.h> 
#include <stdlib.h> 

void getinfo(unsigned int a, unsigned int b, char **s); 

int main(){ 
    unsigned int len_max = 8; 
    unsigned int current_size = 0; 
    char *pStr = malloc(len_max); 
    if(pStr == NULL){ 
     perror("\nMemory allocation\n"); 
     return EXIT_FAILURE; 
    } 
    current_size = len_max; 

    printf("Inserisci hostname: "); 
    getinfo(len_max, current_size, &pStr); 
    printf("\nLa stringa inserita è: %s\n", pStr); 
    free(pStr); 
    return EXIT_SUCCESS; 
} 

void getinfo(unsigned int a, unsigned int b, char **pStr){ 
    unsigned int i = 0; 
    char c = EOF; 
    while((c = getchar()) != '\n'){ 
     *pStr[i++] = (char)c; 
     if(i == b){ 
      b = i+a; 
      if((*pStr = realloc(*pStr, b)) == NULL){ 
       perror("\nMemory allocation error\n"); 
       exit(EXIT_FAILURE); 
      } 
     } 
    } 
    *pStr[i]='\0'; 
} 

Quand j'exécute ce code je suis une erreur de segmentation quand j'appuyez sur Entrée (après que je l'ai écrit la chaîne).
Je suis sûr que le problème est dans la fonction (probablement le problème est le pointeur * s) mais je ne sais pas comment le corriger ...

+0

Note de côté: 'getchar' renvoie' int' et non 'char'. Vous devriez envisager de changer 'c' en' int' –

+0

oh merci :) J'ai corrigé l'erreur! – polslinux

Répondre

3

Vous avez un problème de précédence. Vous devez utiliser

(*s)[i++] = ... 

au lieu de

*s[i++] = ... 

De même, vous devez

(*s)[i]='\0'; 

Lorsque vous écrivez *s[i] vous indexez s. Mais vous voulez indexer *s, et donc exiger les parenthèses.

Je n'ai pas vérifié le reste de votre code, mais j'espère que cela vous aidera sur le chemin du débogage, s'il y a plus d'erreurs.

+0

Merci beaucoup :) tout fonctionne maintenant: D – polslinux

+0

Pourquoi? C'est un post-incrément ... donc d'abord j'ai eu 'i' et je vais mettre à jour' i' ... – polslinux

+0

@polslinux Oui, je pense que vous pourriez avoir raison. Moi je voudrais essayer d'encapsuler la méthode d'ajouter un caractère supplémentaire à la chaîne plutôt que de l'entrelacer avec la boucle. –

1

Le problème est avec *s[i++] = (char)c; essayez de le transformer en (*s)[i++] = (char)c; avec la parenthèse autour du * s. Ainsi que (*s)[i] = '\0'.

+0

Vous avez raison: O il y a un gros trou xD – polslinux

+0

Je ne pense pas. Quand jamais le tampon est plein, vous l'étendez toujours. Donc il y a toujours de la place pour 1 personnage de plus. –

+0

@Totaldowner: Non, attendez ... êtes-vous sûr? Parce que j'ai fait le i ++ donc je compare le "next i" avec b! Je ne compare pas avec la position réelle: D – polslinux