使用C指针分配结构

时间:2016-01-30 12:35:20

标签: 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;
}

输出结果为:

 Alex Popescu 1996
 Emil Ionescu 1997
 Emil Ionescu 1996

b = a; 做什么? b是否指向与a相同的地址?当您将 b.name 更改为 Emil Ionescu 时, a 也会改变它的价值?

为什么只更改名称但年份仍为1996

1 个答案:

答案 0 :(得分:5)

它执行结构的“浅层”副本。

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

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

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