首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何复制结构?

如何复制结构?
EN

Stack Overflow用户
提问于 2015-10-01 00:43:43
回答 4查看 101关注 0票数 0

我有一个问题,我必须复制一个结构并将其添加到新内存中,然后释放旧内存。然后,我必须递增,以便为新内存创建空间,然后再次添加。我认为我的逻辑是正确的,但我总是得到一个分段错误。我不知道我错在哪里。

这是我的结构的一个副本:

代码语言:javascript
复制
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函数的副本:

代码语言:javascript
复制
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);
}

下面是我对函数的调用:

代码语言:javascript
复制
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
}
EN

回答 4

Stack Overflow用户

发布于 2015-10-01 00:53:50

我在这里看到了多个错误:

  • free(book)释放了动态分配的struct book,但没有释放它的动态分配的字段(book->title和类似的东西也必须释放)
  • 你正在调用memcpybook->author和其他char*字段,但是这些字段还没有被动态分配,也许你想做book->title = strdup("literal"),至少有两个错误:首先,你有一个指针的大小,而不是整个结构的sizeof *book1 bytes。然后,复制不包含原始类型但包含指针的字段,然后在两本书之间共享所有权,则应复制每个动态分配的字段。

首先给出一些代码:

代码语言:javascript
复制
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);
  ...
}
票数 2
EN

Stack Overflow用户

发布于 2015-10-01 00:50:55

memcpy不添加空终止符。因此可以手动在memcpy后面添加'\0',或者增加memcpy中字节数。

这样做-

代码语言:javascript
复制
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结尾的,因此,带有说明符%sfprintf会给出seg错误。

如果你在malloc(即100)中使用固定内存,为什么要使用它呢?将它们声明为数组-

代码语言:javascript
复制
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的结果。

票数 1
EN

Stack Overflow用户

发布于 2015-10-01 00:46:22

不要忘记复制字符串文字上的空终止符:

你需要使用"Little Simon", 13,等等:"Little Simon"并不像你想象的那么小。它占用13个字节,而不是12个字节。

否则,您的fprintf将溢出您的字符串,带来灾难性的结果:分段错误是一种可能性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32871511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档