0

Ainsi, comme le suggère le titre que j'ai besoin d'aide avec un morceau de code que j'ai écrit, ce qui est à l'origine d'une erreur de défaut de segmentation, voici le code:Pourquoi ce code provoque-t-il une erreur de segmentation?

vector* reads_file(char* name) 
{ 
    vector *vec = vector_new(); //creates a new vector with capacity = 0, size = 0 and elements = NULL 
    char *str_aux; 
    FILE *fp = fopen(name, "r"); 


    if(fp == NULL){ 
     printf("Error\n"); 
     return NULL; 
    } 


    while(fgets(str_aux, BUFFER_SIZE, fp) != NULL){ 
     if(vextor_inserts(vec, str_aux, -1) == -1) 
      return NULL; 
     free(str_aux); 
    } 

    fclose(fp); 

    return vec; 
} 

et:

int vector_inserts(vector* vec, const char* value, int pos) 
{ 
    int i, n; 

    if(vec == NULL || pos < -1 || pos > vec->size) 
     return -1; 

    /* increases vector's elements if there's not enough capacity */ 
    if(vec->size == vec->capacity) 
    { 
     if(vec->capacity == 0) 
     vec->capacity = 1; 
     else 
     vec->capacity *= 2; 

     vec->elements = (v_element*)realloc(vec->elements, vec->capacity * sizeof(v_element)); 
     if(vec->elements == NULL) 
     return -1; 
    } 

    /* if pos=-1 inserts in the end of the vector */ 
    if(pos == -1) 
     pos = vec->size; 

    /* copies every element from the pos position till the end of the vector to pos+1 */ 
    for(i=vec->size-1; i>=pos; i--) 
    { 
     vec->elements[i+1] = vec->elements[i]; 
    } 

    /* allocates space for the new string on position pos */ 
    vec->elements[pos].str = (char*)calloc(strlen(value)+1, sizeof(char)); 
    if(vec->elements[pos].str == NULL) 
    return -1; 

    /* copies value */ 
    strcpy(vec->elements[pos].str, value); 

    vec->size++; 

    return pos; 
} 

et dont les structures sont:

typedef struct 
{ 
    char *str; 

} v_element; 

typedef struct 
{ 
    /** total number of the vector's elements */ 
    int size; 

    /** vector's capacity */ 
    int capacity; 

    /** array of stored elements */ 
    v_element* elements; 

} vector; 

oh et

#define BUFFER_SIZE 256 

il compile juste à droite (en utilisant un autre morceau de code qui a une fonction principale qui appelle la fonction reads_file (...)) mais en l'exécutant, il se produit une erreur de segmentation lors de l'appel de vector_inserts (...), mais pourquoi cela arrive-t-il? Je ne peux pas comprendre. Il me semble également qu'aucun pointeur n'est appelé à tort.

Toute aide serait appréciée

+0

vector_new(); ? – Steephen

+3

'fgets (str_aux, BUFFER_SIZE, fp)': 'str_aux' ne s'initialise pas. – BLUEPIXY

+0

comment ça va? ou, mieux, pourquoi pas? –

Répondre

0
for(i=vec->size-1; i>=pos; i--) 
    { 
     vec->elements[i+1] = vec->elements[i]; 
    } 

vec->size-1 est l'indice du dernier élément dans le vecteur. vec->elements[i+1] est hors de la fin.

Essayez for(i=vec->size-2; i>=pos; i--)

Note: vous avez vraiment, vraiment, vraiment, vraiment besoin de courir à travers ce code avec un débogueur pour vérifier ce qui se passe exactement, en particulier avec le coin-cas où doit être fait monter la capacité/downed et/ou first/ast sont référencés. Les erreurs obi-wan sont si faciles ...