a.name为什么是Qian

struct stu {
char *name, gender;
int score;

main0

struct stu a={NULL,'m',290},b;
a.name=(char *)malloc(10);
strcpy(a.name,"Zhao");
b=a; b.gender='f'; b.score=350;
strcpy(b.name,"Qian");
printf("%s,%c,%d,", a.name, a.gender, a.score );
printf( "%s,%c,%d\n", b.name, b.gender, b.score );

注意看结构体里面的 *name

因为b=a是把a所成员都赋值给了b
又因为name是个指针,这样a和b的name都指向了同一块内存,当你修改b的时候其实也修改了a
如果想让b不一样,那b 的name也要分配一块内存 b.name = (char *)malloc(10);

因为struct在存放string的时候存放的实际上是字符串数组的首地址
你使得b=a,那么b.name指向的也是a.name所在的区域
此时修改b.name的时候,因为a.name和b.name指向同一区域,所以修改也会对a生效
对于其他两种数据,因为存放的都是值,所以修改时不会互相干扰
你可以不做修改,直接打印&a.name和&b.name,对比两个struct中对应数据的地址就会明白原因
有帮助望采纳

因为你name存的是指针,不管结构体怎么来回赋值,name指向的地址是不变的,当你的B修改了name指向的值,nameA肯定也会变,因为他们指向的是同一个地址