c - 在C中将记录添加到结构

标签 c struct

我有 Books 的结构:

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

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

编辑:

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

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;

这两种方法各有优缺点。例如,第二种使用内存更整洁,但它可能浪费了很多空间。

您的代码不时缺少一些星星。如果您打算修改 vector ,将其作为 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;
}

请记住,无论如何,在释放书籍 vector 之前必须释放所有这些标题。这是在 freeBooks() 中完成的:

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

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

    free( v );
}

您可以在这里访问整个代码: http://ideone.com/mQQeKi

希望这对您有所帮助。

关于c - 在C中将记录添加到结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29197373/

相关文章:

c - 是否可以使用相同的静态void函数在c中使用多个线程?

c - getch() 的文件描述符

c - 错误: derefrencing pointer to incomplete type

c++ - 在结构中初始化字符串数组

c - 在 C 中,如果你有一个由 int 指针和 int 变量本身组成的结构,它有多少字节?

c - 将结构设置为等于值

c++ - 对于非西方语言使用 UTF-8 代替 wchar_t 有什么不便?

c - 文字数组或复合的使用

c# - 在 C# 中使用与指针相关的 C 方法

c++ - 将 3 个整数的结构 vector 解释为数组