开发者社区> 问答> 正文

C语言 结构体复制后free的问题

背景:相互兼容的结构体间(最普通的就是同一类型的结构体)简单赋值(就是“=”),以C9x的标准,是可以直接直接赋值的

情境1
假设有两个一样的结构体

typedef struct SS {
    int a;
    int b;
} SSS;

SSS *s1, *s2;

s1 = malloc (sizeof(struct SS));
s1->a = 23;
s1->b = 24;

s2 = malloc (sizeof(struct SS));
s2 = s1;

free(s1);
printf ("%d %d", s2->a, s2->b);
`s2 = s1这样赋值的话,语句`printf ("%d %d", s2->a, s2->b)`会导致访问已经free的内存吗?``

情境2

typedef struct A {
    int a;
    int b;
} AA;

typedef struct B {
    int c;
    struct A stra;
} BB;

struct B *new_b1, *new_b2;

new_b1 = malloc(sizeof(struct B));
new_b2 = malloc(sizeof(struct B));

new_b1->c = 23;
new_b1->stra.a = 24;
new_b1->stra.b = 25;

new_b2->c = 26;
new_b2->stra = new_b1->stra;

free(new_b1);
printf ("%d %d", new_b2->stra.a, new_b2->stra.b);    //如果这样,printf访问的是已经free的空间吗?

展开
收起
杨冬芳 2016-05-30 15:32:43 2693 0
1 条回答
写回答
取消 提交回答
  • 第一个问题的答案是: 是的,访问了已经释放的内存, 第一种场景你只是让 s2 指向了 s1 的内容, s2 = malloc (sizeof(struct SS)); 这句其实完全没有用

    第二种情况是不会, new_b2->stra = new_b1->stra; 这句的意思是 把 new_b1 里的对象 拷贝 到 new_b2 里,所以,访问的还是 new_b2 里的东西,和 new_b1 没有关系

    2019-07-17 19:20:39
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载