我有一个问题,我必须复制一个结构并将其添加到新内存中,然后释放旧内存。然后,我必须递增,以便为新内存创建空间,然后再次添加。我认为我的逻辑是正确的,但我总是得到一个分段错误。我不知道我错在哪里。
这是我的结构的一个副本:
struct childrensBook *book = (struct childrensBook *) malloc(sizeof(struct childrensBook)); //Structure of book #1
book->title = (char *)malloc(100); //allows memmory of 100 characters
book->author = (char *)malloc(100); //allows memmory of 100 characters
book->publisher = (char *)malloc(100); //allows memmory of 100 characters
book->copyright = 0;
book->price = 0;下面是我的add函数的副本:
int addRecord()
{
int headptr = 0;
struct childrensBook *book = malloc(sizeof(struct childrensBook)); //get book structure
struct childrensBook *book1 = malloc(sizeof(struct childrensBook)); //create structure book1
memcpy(book->title, "We're Going on a Bear Hunt", 26); //populate fields of book
memcpy(book->author, "Michael Rosen", 13); //populate fields of book
memcpy(book->publisher, "Little Simon", 12); //populate fields of book
book->copyright = 1989; //populate fields of book
book->price = 7.99; //populate fields of book
memcpy(book1, book, sizeof *book1); //copy fields of book to book 1
free(book);
}下面是我对函数的调用:
else if(x==4)
{
addRecord();
fprintf(stderr, "You have added the record: %s\n", book->title);
free(book);
moveptr++; //here to incrememnt for new space. This is a globaal variable
}发布于 2015-10-01 00:53:50
我在这里看到了多个错误:
free(book)释放了动态分配的struct book,但没有释放它的动态分配的字段(book->title和类似的东西也必须释放)memcpy到book->author和其他char*字段,但是这些字段还没有被动态分配,也许你想做book->title = strdup("literal"),至少有两个错误:首先,你有一个指针的大小,而不是整个结构的sizeof *book1 bytes。然后,复制不包含原始类型但包含指针的字段,然后在两本书之间共享所有权,则应复制每个动态分配的字段。首先给出一些代码:
void free_book(struct book* b) {
free(b->title);
free(b->author);
...
free(b);
}
struct* book dupe_book(struct book* source) {
struct book* dest = malloc(sizeof(struct book));
dest->price = source->price;
dest->author = strdup(source->author);
...
}发布于 2015-10-01 00:50:55
memcpy不添加空终止符。因此可以手动在memcpy后面添加'\0',或者增加memcpy中字节数。
这样做-
memcpy(book->title, "We're Going on a Bear Hunt", 26); // or use strncpy so it will add null terminator
memcpy(book->author, "Michael Rosen", 14);
memcpy(book->publisher, "Little Simon", 13); 由于您的book->title不是以null结尾的,因此,带有说明符%s的fprintf会给出seg错误。
如果你在malloc(即100)中使用固定内存,为什么要使用它呢?将它们声明为数组-
book->title = (char *)malloc(100); // in struct declare title as char title[100]
book->author = (char *)malloc(100); // similar with rest.
book->publisher = (char *)malloc(100); 然后你就不需要紧张的去free它了。
注意-如果你使用malloc,那么就像注释中提到的那样,请不要强制转换malloc的结果。
发布于 2015-10-01 00:46:22
不要忘记复制字符串文字上的空终止符:
你需要使用"Little Simon", 13,等等:"Little Simon"并不像你想象的那么小。它占用13个字节,而不是12个字节。
否则,您的fprintf将溢出您的字符串,带来灾难性的结果:分段错误是一种可能性。
https://stackoverflow.com/questions/32871511
复制相似问题