使用C指针分配结构

six*_*eet 3 c pointers

任何人都可以解释以下代码的输出:

int main() {
    struct student {
        char *nume;
        char an[5];
    } a, b;

    a.nume = (char*)malloc(20);
    strcpy(a.nume, "Alex Popescu");
    strcpy(a.an, "1996");

    printf("%s %s\n", a.nume, a.an);

    b = a;
    strcpy(b.nume, "Emil Ionescu");
    strcpy(b.an, "1997");

    printf("%s %s\n", b.nume, b.an);

    struct student *pa = &a;

    printf("%s %s\n", pa->nume, (*pa).an);

    free(a.nume);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

 Alex Popescu 1996
 Emil Ionescu 1997
 Emil Ionescu 1996
Run Code Online (Sandbox Code Playgroud)

怎么b = a;办?被b指向相同的地址a?当你改变b.nameEmil Ionescu,也a正在改变它的价值?

为什么只有名称改变但是年份仍然存在1996

250*_*501 5

它是结构的"浅层"副本.

每个成员都a被复制到每个成员中b.由于指针指向某个内存,因此在这种情况下,两个结构的两个指针都将指向相同的内存.如果更改了内存,则两个指针都会看到该更改.

但是数组包含它自己的内存,因此在一个结构中更改数组只会影响该结构.

我觉得你很困惑,因为你使用了一个结构.没有什么特别之处,只是碰巧拿着一个指针和一个数组.您的代码将是相同的,如果您使用两个指针和两个数组并手动复制它们而不是两个结构.你应该试试.