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