结构......有人能搞清楚吗?

时间:2018-05-30 19:11:17

标签: c pointers structure

为什么p-> p1产生1,而s2.p1产生0?它们都指向完全相同的东西,而p-> p2和s2.p2不会发生这种情况。

#include<stdio.h>
#include<stdlib.h>

struct S1{
    int p1, p2;
};
struct S2{
    int p1;
    struct S1 s1;
    int p2;
};

int main (void){
    int s = 0;
    struct S2 s2 = {1,2,3,0};
    struct S2 *p;
    p = (struct s2 *)malloc(sizeof(struct S2));

    *p = s2;


    s2.p1 = 0;
    printf("p->p1 %d,s2.p1 %d   \n\n",p->p1, s2.p1 );
    printf("%d\t %d\t %d\t %d\t %d\n",p->p1 , s2.p1 , p->p2 , p->s1.p2 );
    s = p->p1 + s2.p1 + p->p2 + p->s1.p2;

    free(p);
    printf("%d", s);
    return 0;
    }

2 个答案:

答案 0 :(得分:4)

因为您将s2的内容复制到p指向的结构中,然后更新了s2内容。

答案 1 :(得分:0)

  

为什么p-> p1产生1,......?

因为代码上次使用****

分配了p->p1,其值为1
//              v--- p1 member
struct S2 s2 = {1,2,3,0};
struct S2 *p;
p = (struct s2 *)malloc(sizeof(struct S2));
*p = s2;  // ****  This copies the contents of `s2` to `*p`.
  

为什么... s2.p1产生0?

因为代码以后将{0}分配给s2.p1

//              v--- p1 member
struct S2 s2 = {1,2,3,0};
...
s2.p1 = 0;
  

他们(p->p1s2.p1)都指向完全相同的东西

不,他们没有。 p是一个指定了分配内存值的指针,s2是一个用struct S2 s2定义的对象。分配的内存和对象s2不是同一个位置。 s2作为一种结构,从不指向任何东西。 @melpomene