为什么这段代码会导致分段错误?

时间:2017-03-25 02:30:04

标签: c pointers struct segmentation-fault dynamic-memory-allocation

所以,正如标题所示,我需要帮助我编写的一段代码,这会导致分段错误错误,这里是代码:

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;
}

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;
}

,其结构如下:

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;

哦和

#define BUFFER_SIZE  256

它编译得恰到好处(当使用另一段具有调用reads_file(...)函数的main函数时)但在执行它时,它会在调用vector_inserts期间发生分段错误(... )功能,但为什么会这样?我无法弄清楚。在我看来,没有错误地调用指针。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

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

vec->size-1是向量中最后一个元素的索引。 vec->elements[i+1]已经结束了。

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

注意:你真的,真的,真的,真的,真的需要用调试器来运行这个代码来检查究竟发生了什么,尤其是在需要升级/降低容量的角落和/或第一个/ ast元素被引用。 obi-wan错误很容易......