2013-01-24 3 views
0

J'ai ce code:pointeur strcpy char abort

 char **arr; 
    char* line=NULL; 
    int i=0; 
    size_t len=0; 
    ssize_t read1; 

    fp=fopen("list.txt","r"); 
    if(fp==NULL) 
     exit(EXIT_FAILURE); 

    while((read1=getline(&line,&len,fp))!=-1) 
     i++; 
    fclose(fp); 

    fp=fopen("list.txt","r"); 
    if(fp==NULL) 
     exit(EXIT_FAILURE); 

    arr=(char**)malloc(i*sizeof(char*)); // i is a variable i use to know the number of lines 
    i=0; 

    while((read1=getline(&line,&len,fp))!=-1) 
    { 
     line[strlen(line)]='\0'; 
     arr[i]=(char*)malloc(strlen(line)+1); 
     strcpy(arr[i],line); 
     i++; 
    } 

Lorsque je tente strcpy le programme crashes.Is un problème malloc? Je suis très sûr que i est assez grand. Et le line est char* et est NULL en premier.

EDIT: J'ai oublié que ce programme est en Qt.

+1

Vous n'avez pas besoin de convertir la valeur de retour de 'malloc()' dans un programme C. –

+4

*** "' i' est une variable que j'utilise pour connaître le nombre de lignes "*** - Alors pourquoi est-il nommé' i' et non 'numberOfLines' /' linesNumber'? – LihO

+0

Comment 'line' est-il défini? Et quelle est la définition/valeur de 'len'? –

Répondre

3

Il y a quelques problèmes avec le code, je vais commenter ce que je crois devrait fonctionner ...:

// I **assume** that these are the definitions for these variables 
// based on your comments 
size_t len = 0; 
char *line = NULL; 
ssize_t read1; 

// I **assume** that i has a reasonable value here, but this is not good to assume, 
// what if the file is a line longer tomorrow? I hope that you calculate the number 
// of lines somehow, that would be "less bad" 
int i = 10; // 10 lines in the file, who knows ?!? 
char **arr; 

// don't bother casting... 
arr = malloc(i * sizeof(char*)); 
i=0; 

while((read1 = getline(&line, &len, fp)) != -1) { 

    // THIS LINE DOES NOTHING, so we can just remove it 
    // line[strlen(line)]='\0'; 

    arr[i] = line; // since you asked getline to allocate a buffer for 
        // you (line was NULL), you can just store the buffer directly 
        // it's YOURS 
    i++; 

    // THIS IS THE BIG ONE: 
    // it is needed because otherwise the NEXT call to getline will 
    // reuse the same buffer, which may not be big enough 
    line = NULL; 
} 

De plus, plus tard pour le nettoyage, vous devriez faire quelque chose comme ceci:

int j; 
for(j = 0; j < i; ++j) { 
    free(arr[j]); 
} 
free(arr); 
arr = NULL; // not necessary, but good practice to avoid double frees and such 
+0

Merci, mais ne fonctionne toujours pas. Je vais modifier le code pour être plus clair. –

+0

+1: @EmilGrigore s'il vous plaît, car si 'getline()' fait ce que cela prescrit, ce code est correct (sauf pour la vérification manquante de 'i', qui est facilement la plus mauvaise variable nommée dans ce bloc de code. – WhozCraig

+0

@Emil, s'il vous plaît définir "ne fonctionne pas" parce que le code que j'ai fourni ne devrait pas s'écraser au mieux de mes connaissances.Avez-vous essayé d'ajouter le "re'NULL'ing" de ligne comme dans mon code? –

2

Vous ne test si vous avez des lignes plus que l'actualy d'origine i

arr=(char**)malloc(i_ori*sizeof(char*));//i_ori is a variable i use to know the number of lines 
i=0; 

while((read1=getline(&line,&len,fp))!=-1 && i<i_ori) 

En outre, vous tester si jamais malloc retour NULL !! Voir https://stackoverflow.com/a/2280342/1458030

@Emil Grigore: Lorsque je tente STRCPY le programme crashes.Is un problème de malloc ? Je suis très sûr que je suis assez grand.

Oui! vous devez tester NULL.

Si vous utilisez C++ et Qt, pourquoi pas les conteneurs, les flux?

+0

Je suis sûr que j'ai le même nombre de lignes que i –

+0

@EmilGrigore: Alors s'il vous plaît modifier votre message pour inclure un [cas de test minimal] (http://sscce.org) qui le démontre. –