在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
希望对您有所帮助。
我有书籍的结构:
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
希望对您有所帮助。