在C中向结构添加记录

在C中向结构添加记录,c,struct,C,Struct,我有书的结构: 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 me

我有书的结构:

 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
}

为什么此代码是错误的?

首先,请查看您的结构:

 typedef struct {
   int ID;
   char* Title;
 } Book;
此结构意味着您不打算将书籍的标题存储在结构中,而是通过strdup()或其他方式存储在堆中。如果您计划将标题存储在结构中,则可能会出现以下情况:

 typedef struct {
   int ID;
   char Title[100];
 } Book;
这两种方法各有优缺点。例如,第二个使用内存更整洁,但它可能会浪费大量空间

你的代码到处都缺少一些星星。如果你打算修改你的向量,把它作为Book**传递是正确的,但是记住,在每次使用中,你必须在它的名字前加一颗星星。num_记录也是如此。最后,当你没有书时(第一步),你不应该复制或免费任何东西

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;
}
无论如何,请记住,在释放书籍向量之前,必须先释放所有这些标题。这在自由书()中完成:

void freeBooks(Book*v,int-num)
{
int i=0;
对于(;i
您可以在此处访问整个代码:


希望这能有所帮助。

你在哪里定义了k和i?是否全局定义了
i
k
?在其他地方分配一个全局
k
,并在此函数中释放它有点不稳定。如果未全局定义
i
k
,则显示的代码将无法编译。既然你说你已经运行了它,我就假设它是全局的。
int*records\u num){
records\u num是一个指针变量。
malloc(sizeof(Book)*records\u num);
这里,你使用它就像它是一个int一样。所以,我必须删除函数参数中的*?我想通过引用传递int值并添加记录。
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;
}
void freeBooks(Book * v, int num)
{
    int i = 0;

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

    free( v );
}