2017-10-13 11 views
-2

J'essaie d'entrer une liste de chaînes. La liste peut varier en longueur, alors j'essaie d'utiliser l'allocation dynamique. Chaque chaîne a 20 caractères max. La liste se termine par un seul point. Je travaille dessus depuis un certain temps, mais je continue à avoir une erreur de segmentation et je ne sais pas pourquoi. Je suppose que l'erreur est dans mon utilisation de realloc/malloc, mais je ne peux pas voir exactement ce que je fais mal. Le bloc de code fait partie d'un programme plus vaste, mais j'ai choisi ce bloc et j'essaie de le faire fonctionner. Cela fonctionne bien pour une "liste" d'un mot suivi d'un point. Dès que j'essaie de lire une liste de deux ou plusieurs chaînes, j'obtiens l'erreur de segmentation. Toute aide serait géniale, merci!entrer une liste de chaînes en utilisant l'allocation dynamique dans c

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

char **resizeDynamicArray(char **arr, int newSize){ 
    char **ptr = realloc(arr, newSize*sizeof(char*)); 
    if (ptr==NULL) { 
    printf("Error: memory allocation failed.\n"); 
    exit(-1); 
    } 
    return ptr; 
} 

int input (char ***seq){ 
    int len = 0; 
    char string[21]; 
    *seq=NULL; 

    do{ 
    scanf("%s", string); 
    if (string[0] != '.'){ 
     *seq = resizeDynamicArray(*seq, (len+1)); 
     *seq[len] = malloc(sizeof(char[21])); 
     strcpy((*seq)[len], string); 
     len++; 
    } 
    } while (string[0] != '.'); 
    return len; 
} 

int main(int argc, char *argv[]) { 
    int length; 
    char **words; 

    length = input(&words); 
    for (int i=0; i<length; ++i){ 
    printf("%s\n", words[i]); 
    } 
    for (int i=0; i<length; ++i){ 
    free(words[i]); 
    } 
    free(words); 
    return 0; 
} 
+3

Un programmeur trois étoiles est censé pouvoir déboguer son propre programme. – EOF

+0

Jetez un coup d'œil à ['gdb'] (http://www.gnu.org/software/gdb/documentation/) –

+0

Pas du tout utile EOF. Je suis loin d'être un "programmeur trois étoiles". Je suis nouveau à coder et à prendre un cours atm. Merci Patrick, je l'ai déjà résolu. Je vais y jeter un coup d'oeil quand même. – Matt

Répondre

0

Modifier la ligne suivante:

*seq[len] = malloc(sizeof(char[21])); 

à:

(*seq)[len] = malloc(sizeof(char[21])); 

Il y a un niveau d'indirection supplémentaire qui doit être déréférencé avant de pouvoir index dans le tableau de haut niveau .

+0

Merci beaucoup. C'était exactement ce qui n'allait pas. Cela fonctionne très bien maintenant. – Matt