所以,正如标题所示,我需要帮助我编写的一段代码,这会导致分段错误错误,这里是代码:
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期间发生分段错误(... )功能,但为什么会这样?我无法弄清楚。在我看来,没有错误地调用指针。
任何帮助将不胜感激
答案 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错误很容易......