免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9070 | 回复: 12
打印 上一主题 下一主题

[C] 关于c结构体内存拷贝后如何释放的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-05 10:29 |只看该作者 |倒序浏览
2可用积分
  1. typedef struct Test
  2. {
  3.         int a;
  4.         char* b;
  5. }Test;

  6. int main(void)
  7. {
  8.    char* b;
  9.    Test *aTest = 0;
  10.    Test *bTest = 0;
  11.    aTest = (Test*)malloc(sizeof(Test));
  12.    bTest = (Test*)malloc(sizeof(Test));
  13.    if(!aTest)
  14.            return 0;
  15.    aTest->a = 10;
  16.    b = "asfdasf";
  17.    aTest->b =(char*) malloc(strlen(b)+1);
  18.    if(!aTest->b)
  19.            return 0;
  20.    strcpy(aTest->b,b);
  21.    memcpy(bTest,aTest,sizeof(Test));
  22.    if(aTest->b)
  23.    {
  24.            free(aTest->b);
  25.        aTest->b = NULL;
  26.    }
  27.    if(aTest)
  28.    {
  29.            free(aTest);
  30.            aTest =NULL;
  31.    }
  32.    if(bTest->b)
  33.    {
  34.            free(bTest->b);   //*
  35.        bTest->b = NULL;
  36.    }
  37.    if(bTest)
  38.    {
  39.            free(bTest);
  40.            bTest = NULL;
  41.    }

  42. }
复制代码


最后在*处异常退出,这是为什么呢?谢谢了。

最佳答案

查看完整内容

memcpy(bTest,aTest,sizeof(Test)); 只是把aTest->b指向的地址考给了bTest->b,所以两个指针指向同一块内存。你打印一下sizeof(Test)就明白了

论坛徽章:
0
2 [报告]
发表于 2008-06-05 10:29 |只看该作者
原帖由 aaaab 于 2008-6-5 13:33 发表
memcpy(bTest,aTest,sizeof(Test));  
只是把aTest指向的部分复制给了bTest, 也就是说如果结构体内还包含指针指向某块内存.只是让两个指针指向同一地方,而不是重新分配内存给它,然后把内容复制?

有点昏了,再 ...



memcpy(bTest,aTest,sizeof(Test));


只是把aTest->b指向的地址考给了bTest->b,所以两个指针指向同一块内存。

你打印一下sizeof(Test)就明白了

论坛徽章:
0
3 [报告]
发表于 2008-06-05 10:33 |只看该作者
同一空间,free 2次, 当然异常了

论坛徽章:
0
4 [报告]
发表于 2008-06-05 10:34 |只看该作者
同一段内存释放了两次
free(aTest->b);
free(bTest->b);

两个指针指向的是同一段内存

论坛徽章:
0
5 [报告]
发表于 2008-06-05 10:38 |只看该作者
楼上两位, 对。

论坛徽章:
0
6 [报告]
发表于 2008-06-05 13:20 |只看该作者
关于结构体memcpy拷贝的问题,我还是整不太明白
1. memcpy的机制是内存拷贝, memcpy(bTest,aTest,sizeof(Test)); 就是把aTest指向的内存拷贝给bTest.按理说,应该先分配一块内存给bTest, 然后把aTest的内容复制给bTest. 为什么还是bTest->b 和aTest->b都指向同一块内存呢?

2. 我跟了一下,拷贝以后,aTest和bTest的地址是不同的,但aTest->b和bTest->b的地址相同. 那么,我为了保险起见,当aTest->b释放完后,我让aTest->b指针=NULL,可是为什么aTest->b不等于NULL 呢?

谢谢

论坛徽章:
0
7 [报告]
发表于 2008-06-05 13:30 |只看该作者
  1. void main()
  2. {
  3.         char* b = "asdfasfasf";
  4.         char *a = malloc(strlen(b)+1);
  5.         char *c;
  6.         memcpy(a,b,strlen(b)+1);
  7.         c = a;
  8.         free(a);
  9.         a = NULL;
  10.        
  11. }
复制代码



概念还是没搞透彻.我测试了一下,发现让c = a, 释放完a以后, c其实就成了野指针.一用就错,得在a = NULL; 后面加一个c = NULL; c = a只是让c和a指向的位置相同.

论坛徽章:
0
8 [报告]
发表于 2008-06-05 13:33 |只看该作者
memcpy(bTest,aTest,sizeof(Test));  
只是把aTest指向的部分复制给了bTest, 也就是说如果结构体内还包含指针指向某块内存.只是让两个指针指向同一地方,而不是重新分配内存给它,然后把内容复制?

有点昏了,再看看书.请高手帮着澄清一下.谢谢

论坛徽章:
0
9 [报告]
发表于 2008-06-05 13:52 |只看该作者
原型:extern void *memcpy(void *dest, void *src, unsigned int count);

  用法:#include <string.h>
  
  功能:由src所指内存区域复制count个字节到dest所指内存区域。
  
  说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
  
  举例:

      // memcpy.c
      
      #include <syslib.h>
      #include <string.h>

      main()
      {
        char *s="Golden Global View";
        char d[20];
        
        clrscr();
        
        memcpy(d,s,strlen(s));
        d[strlen(s)]=0;
        printf("%s",d);

        getchar();
        return 0;
      }

论坛徽章:
0
10 [报告]
发表于 2008-06-05 14:37 |只看该作者
src和dest所指内存区域不能重叠,可是我写的那个证明memcpy后Test::b两段内存是相同的啊.
谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP