gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:40:21 24 4
gpt4 key购买 nike

我有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com