2015-03-22 2 views
1

У меня есть структура книги:Добавление записи структурировать в C

typedef struct { 
    int ID; 
    char* Title; 
} Book; 

Я просто хочу, чтобы добавить запись в таблицу Забронируйте. Это моя функция:

void AddRecord(Book**b, int *records_num){ 

    *records_num = *records_num + 1; 

    Book* temp = (Book*)malloc(sizeof(Book) * records_num); 
//FirstMethod 
    memcpy(temp, *b, records_num * sizeof(Book)); //Doesn't work 

    //SecondMethod 
    int j; 

    for(j = 0; j < records_num - 1; j++){ 
     temp[j] = (*b)[j]; 
    } 

    free(*b); 
    *b = temp; 
//Some logic about adding a new record 
} 

Оба метода не работают после запуска. Вот как я называю эту функцию: AddRecord (books, & number_of_lines); Это не работает. Что здесь не так?

EDIT:

Я изменил некоторые вещи в коде. Он по-прежнему работает плохо, но не дает никаких ошибок.

void AddRecord(Book *b, int *records_num){ 

    *records_num = *records_num + 1; 

    Book* temp = (Book *)malloc(sizeof(Book) * *records_num); 
    memcpy(temp, b, sizeof(b)); 
    b = (Book *)realloc(b, sizeof(Book) * *records_num); 
    memcpy(b, temp, sizeof(temp)); 
    b[*records_num - 1].ID = *records_num; 
} 

Зачем этот код является неправильным?

+1

Где вы определили k и i? –

+0

Определены ли 'i' и' k' глобально? Выделение глобального «k» в другом месте и освобождение его в этой функции несколько неустойчиво. Если 'i' и' k' не определены глобально, тогда код, который вы показываете, не будет компилироваться. Поскольку вы говорите, что запустили его, я предполагаю, что они глобальны. – lurker

+0

'int * records_num) {' records_num - переменная указателя. 'malloc (sizeof (Book) * records_num);' здесь вы используете его, как если бы это был int. – wildplasser

ответ

1

Во-первых, обратите внимание на вашу структуру:

typedef struct { 
    int ID; 
    char* Title; 
} Book; 

Эта структура означает, что вы не собираетесь хранить название книги внутри на-структуру, но в куче, с помощью strdup() или что-то в этом роде. Если вы планировали сохранить титул Whithin в структуры, то вы бы что-то вроде:

typedef struct { 
    int ID; 
    char Title[100]; 
} Book; 

Оба метода имеют сильные и слабые стороны. Например, второй из них более аккуратный, используя память, но, вероятно, он тратит много места.

Ваш код имеет некоторые звезды, отсутствующие здесь и там. Если вы планируете изменить свой вектор, правильно передать его как книгу **, но затем помните, что при каждом использовании вам нужно будет поставить звезду перед ее именем. То же самое происходит с num_records. Наконец, когда у вас нет книг (первый шаг), вы не должны копировать или освобождать что-либо.

void addRecord(Book** v, int *records_num, const Book * b) 
{ 
    // Reserve new space and copy 
    Book * temp = (Book *) malloc(sizeof(Book) * (*records_num + 1)); 

    if (*v != NULL) { 
     memcpy(temp, *v, (*records_num) * sizeof(Book)); 
     free(*v); 
    } 

    *v = temp; 

    // Add new book 
    (*v)[ *records_num ].id = b->id; 
    (*v)[ *records_num ].title = strdup(b->title); 
    ++(*records_num); 
} 

Как вы это используете? Определив некоторые книги и добавив их в свою коллекцию.

int main(void) { 
    Book * books = NULL; 
    Book b1; 
    Book b2; 
    Book b3; 
    int num = 0; 

    // Prepare books 
    b1.id = 1; 
    b1.title = "Moby Dick"; 
    b2.id = 2; 
    b2.title = "War and peace"; 
    b3.id = 3; 
    b3.title = "Anna Karenina"; 

    // Add them to the vector 
    addRecord(&books, &num, &b1); 
    addRecord(&books, &num, &b2); 
    addRecord(&books, &num, &b3); 

    // Show all books 
    showBooks(books, num); 

    // Finish 
    freeBooks(books, num); 
    return 0; 
} 

Помните, что все эти названия должны быть освобождены до того, как вектор книг будет освобожден. Это делается в freeBooks():

void freeBooks(Book * v, int num) 
{ 
    int i = 0; 

    for(; i < num; ++i) { 
     free(v[ i ].title); 
    } 

    free(v); 
} 

Вы можете получить доступ к всему коду здесь: http://ideone.com/mQQeKi

Надеется, что это помогает.

+0

Такой отличный ответ!Потрясающие. Большое спасибо. –

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