在C中将记录添加到结构

Adding record to structure in C

我有书籍的结构:

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

我只是想在书table中添加记录。那是我的职责:

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); 它不起作用。这里有什么问题?

编辑:

我更改了一些代码。它仍然无法正常工作,但没有报错。

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

为什么这个代码是错误的?

首先,看看你的结构:

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

这个结构意味着你不打算将书名存储在内部结构中,而是在堆中,通过strdup() 之类的。如果您计划将标题存储在结构中,那么您会得到如下内容:

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

两种方法各有优缺点。比如第二个用内存比较整齐,但是估计浪费了很多space.

您的代码中有一些星号缺失。如果您打算修改矢量,将其作为 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 );
}

你如何使用它?通过定义一些书籍并将它们添加到您的 collection.

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

希望对您有所帮助。