1 2 3 4811 2022-06-04 13:09 采纳率: 100%
浏览 56
已结题

问下有没有人来解答一二

假设一个C语言程序有两个源文件:main.c和procl.c,它们的内容如图所示。
a)main.c文件
1 #include <stdio.h>
2 unsigned x=257;
3 short y,z=2;
4 void procl(void);
5 void mian()
6 {
7 procl();
8 printf("x=%u,z=%d\n",x,z);
9 return 0;
10 }

b)procl.c文件
1 double x;
2
3 void procl()
4 {
5 x=-1.5;
6 }

回答下列问题。
(1)在上述两个文件中出现的返回哪些是强符号?哪些是弱符号?
(2)程序执行后打印的结果是什么?请分别画出第7行的procl()函数调用前、后,在地址&x和&z中存放的内容。若第3行改为“short=1,z=2;”打印结果是什么?
(3)修改文件procl,使得main.c能输出正确的结果(即x=7,z=2)。要求修改时不能改变任何变量的数据类型和名字。

  • 写回答

1条回答 默认 最新

  • 不吐泡泡的咸鱼 2022-06-04 14:54
    关注
    // a)main.c文件
    #include <stdio.h>
    unsigned x=257;
    short y,z=2;
    void procl(void);
    int main() // 题目里字母有问题
    {
        procl();
        printf("x=%u,z=%d\n",x,z);
        return 0;
    }
    
    // b)procl.c文件
    double x;
    
    void procl()
    {
        x=-1.5;
    }
    

    以下是编译之后的提示:
    ld: warning: tentative definition of '_x' with size 8 from '/var/folders/kw/ywzc0sr91yl1fgffp6j4s5y00000gn/T/proc-43a858.o' is being replaced by real definition of smaller size 4 from '/var/folders/kw/ywzc0sr91yl1fgffp6j4s5y00000gn/T/main-5f3685.o'
    执行结果:x=0,z=0

    1. 全局变量为外部符号,又初始值的变量为强符号,数据段全局变量区分配地址。未初始化的全局变量为弱符号,在bss段分配地址。bss在进程映射之前不存储数据,有段大小,但在可执行文件中不占空间
      所以main.c中强符号为:x, z 弱符号为y;procl中只有弱符号x.在进行符号决议时,两个对象文件中的x符号决议冲突,取强符号
    2. x=0,z=0。注意,此结果与机器CPU字节序有关,本答案为小端字节序下的答案
      procl()调用之前 &x位置的值为257, &z位置的值为2. 调用之后 &x紧邻的8个字节被赋值为double类型-1.5,
      根据IEEE754标准,双精度浮点-1.5 = -1.1 * 2^0 2进制表示为 1 00111111111 100...52个0...0
      在小端字节序的机器上,十六进制表示为0x0000 0000 0000 8ff9 分别对应变量地址&x = 0x0000 0000 &z=0x0000
      第三行改动后,y被放在了数据段,在x与z之间。打印结果将是 x=0, z=-16392
    3. 通过内存赋值方式,改为*(unsigned int *)(&x) = 7
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月13日
  • 已采纳回答 6月5日
  • 创建了问题 6月4日

悬赏问题

  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染