Структура .. кто-нибудь может понять это - PullRequest
0 голосов
/ 30 мая 2018

Почему 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 голосов
/ 30 мая 2018

Почему 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->p1, s2.p1) оба указывают на одно и то же

Нет, они этого не делают.p - указатель, которому присвоено значение из выделенной памяти, а s2 - объект, определенный с struct S2 s2.Выделенная память и объект s2 не совпадают.s2 как структура, никогда ни на что не указывающая. @ Мельпомена

0 голосов
/ 30 мая 2018

Поскольку вы скопировали содержимое s2 в структуру, указанную p, а затем обновили содержимое s2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...