背景:相互兼容的结构体间(最普通的就是同一类型的结构体)简单赋值(就是“=”),以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的空间吗?
第一个问题的答案是: 是的,访问了已经释放的内存, 第一种场景你只是让 s2 指向了 s1 的内容, s2 = malloc (sizeof(struct SS)); 这句其实完全没有用
第二种情况是不会, new_b2->stra = new_b1->stra; 这句的意思是 把 new_b1 里的对象 拷贝 到 new_b2 里,所以,访问的还是 new_b2 里的东西,和 new_b1 没有关系
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。