任何人都可以解释以下代码的输出:
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
?
答案 0 :(得分:5)
它执行结构的“浅层”副本。
a
中的每个成员都会被复制到b
中的每个成员。由于指针指向到某个内存,在这种情况下,两个结构的两个指针都将指向同一个内存。如果更改了内存,则两个指针都将看到更改。
但是数组包含它自己的内存,所以在一个结构中更改数组只会影响该结构。
我认为你很困惑,因为你使用了一个结构。没有什么特别之处,只是碰巧拿着一个指针和一个数组。您的代码将是相同的,如果您使用两个指针和两个数组并手动复制它们而不是两个结构。你应该试试。