非欧切尔 2022-12-12 13:15 采纳率: 90.5%
浏览 26
已结题

答案为什么是B呀?谁可以详细解释一下?

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef struct stu

{

char  *name, gender;

int  score;

} STU;

void f(char *p)

{

p=(char *)malloc(10);

strcpy(p, "Qian");

}

main()

{

STU  a= {NULL, 'm', 290}, b;

a.name=(char *)malloc(10);

strcpy( a.name, "Zhao" );

b = a;

f(b.name);

b.gender = 'f';

b.score = 350;

printf("%s,%c,%d,", a.name, a.gender, a.score);

printf("%s,%c,%d\\n", b.name, b.gender, b.score);

}

则程序的输出结果是()。

A

Zhao,m,290,Qian,f,350
B

Zhao,m,290,Zhao,f,350
C

Qian,f,350,Qian,f,350
D

Qian,m,290,Qian,f,350
  • 写回答

3条回答 默认 最新

  • 於黾 2022-12-12 13:37
    关注

    这题的考点其实就在这里:
    “修改形参的值永远不会改变实参”
    实参和形参其实跟两个变量赋值是一样一样的
    比如int a=0;int b=a;b=2;那么b被修改了a并不会被修改,因为b只是a的一个拷贝。假如a是实参b是形参那么结果是一样的。
    当a和b是两个指针的时候也是如此。
    int c=0;int *a=&c;int *b=a;此时a和b这两个指针都指向c的地址,如果修改*a或*b修改的都是c的值。
    而如果执行的是b=&(int *)malloc(1);将它重新指向一个新的内存,此时改变的是指针的值(指针的值就是地址),再改变b的时候就和c无关了。
    也就是说,当b的值(指针地址)被改变时,并不会改变a

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月20日
  • 已采纳回答 12月12日
  • 创建了问题 12月12日