2014-12-15 3 views
2

Я пытаюсь использовать realloc для динамического создания экземпляров структуры, заполняя ее данными из временной структуры, когда я иду. Программа выходит из строя, когда она достигает линии, чтобы повторно вывести указатель структуры, но я не уверен, как я должен структурировать эту функцию. У меня есть следующий код:Использование realloc в массиве динамической структуры

#define MAX_STRING 50 

struct data { 
int ref; 
int port; 
char data[MAX_STRING+1]; 
}valid, invalid; 

void read_file(FILE *file); 
void validate(struct data* temp); 

int g = 0; 

int main(){ 

    char inputfile[100]; 
    FILE *file = fopen("file.txt" , "r"); 

    if (file != NULL){ 
     read_file (file); 
    } 

    else{ 
    // Some code here.. 
    } 

    return 0; 
} 

void read_file(FILE *file){ 

    struct data* temp = malloc(sizeof(struct data)); 

    char buf[1024]; 
    while(!feof(file)){ 

     fgets(buf, sizeof buf, file)) 

     sscanf(buffer, "%d.%d.%s", &temp->ref, &temp->port, &temp->data); 

     validate(temp); 
     g++; 

    } 
} 

void validate(struct data* temp){ 

    if((some condition) && (some condition)) 
    { 
     create_valid(temp); 
    } 

    if((some condition) && (some condition)) 
    { 
     create_invalid(temp); 
    } 
} 

Я не уверен в том, как структурировать следующую функцию:

int create_vaild(struct data* temp){ 

    struct data* valid = malloc(sizeof(struct data)); <<<<<<<<< Line that crashes 

    valid = realloc(valid, g * sizeof(struct data)); 

    valid[g] = *temp; 

    if (valid[g] == NULL){ 
     //error. 
    }; 
    printf("\n%i:%i:%s\n", (valid+g)->ref, (valid+g)->port, (valid+g)->data); 



return 0; 

} 
+0

Вы уверены, что это линия, которая вызывает крушение? – Gopi

+0

Покажите минимальный пример, кто знает, что происходит с 'g'. – 2501

+0

См. Также связанный предыдущий вопрос [Объект переменной величины не может быть инициализирован, создавая массив структуры] (http://stackoverflow.com/questions/27478195/variable-sized-object-may-not-be-initialized-creating-structure-array). –

ответ

4

я вижу одну потенциальную проблему:

Вы г набор в 0 т.е.

int g =0; 

Вы еще не увеличили его до звонка до create_valid(). Вы используете это значение для выделения памяти внутри этой функции:

valid = realloc(valid, g * sizeof(struct data)); 

Так что теперь g является 0.

Далее в следующей строке разыменовать этот указатель

valid[g] = *temp; 

Это часть памяти, которую вы не выделены в качестве realloc() не выделяет память для вас еще потому вы прошли от 0 до it.Hence аварии.

+0

Возможно, это связано с тем, что весь код не отправлен. У части, которая выходит из строя, есть одна определенная опечатка в 'int create_vaild()', поэтому это чья-то догадка (как обычно), является ли что-то неправильное реальным или фиктивным. –

+1

в любом случае независимо от того, какое значение имеет значение 'g', выделяя' g * sizeof (struct data) ', а затем доступ к' valid [g] 'всегда неверен –

Смежные вопросы