没有合适的资源?快使用搜索试试~ 我知道了~
第4章习题参考答案1
需积分: 0 6 下载量 66 浏览量
2022-08-03
13:40:28
上传
评论
收藏 297KB PDF 举报
温馨提示
试读
4页
5. 假设一个 C 语言程序有两个源文件:main.c 和 proc1.c,它们的内容如图 4.24 所示 7. 以下由两个目标模块 m1 和 m2 组成的程序
资源推荐
资源详情
资源评论
136
0 1 2 3
&x
&y
00
00
00
00
00
00
F8
BF
0 1 2 3
&x
&y
01
01
00
00
00
00
02
00
习题
5. 假设一个 C 语言程序有两个源文件:main.c 和 proc1.c,它们的内容如图 4.24 所示。
图 4.24 题 5 用图
回答下列问题。
(1)在上述两个文件中出现的符号哪些是强符号?哪些是弱符号?
(2)程序执行后打印的结果是什么?请分别画出执行第 7 行的 proc1()函数调用前、后,在地址&x 和
&z 中存放的内容。
(3)修改文件 proc1,使得 main.c 能输出正确的结果(即 x=257, z=2)。要求修改时不能改变任何变
量的数据类型和名字。
参考答案:
(1)在上述两个文件中,main.c 中的强符号有 x、z、main,弱符号有 y;proc1.c 中的强符号有 proc1,
弱符号有 x。其中,符号 x 在 main.c 和 proc1.c 中都有定义,属于多重定义符号。根据多重定义
符号处理规则 2(若一个符号被说明为一次强符号定义和多次弱符号定义,则按强符号定义为
准),符号 x 的定义以 main.c 中的强符号 x 为准,即在 main.o 的.data 节中分配 x,占 4 个字节,
随后两个字节存放 y,再后面两个字节存放 z。
(2)程序执行时,在调用 proc1()函数之前,&x 中存放的是 x 的机器数:00000101H,随后两个字节
(地址为&y)存放 y,它没有初始化,故通常为 0;再后面两个字节存放 z 的机器数:0002H。
如下左图所示:
在调用 proc1()函数以后,因为 proc1()中的符号 x 是弱符号,因此,x 的定义以 main 中的强符号
x 为准,执行 x=-1.5 后,便将“-1.5”的机器数 BFF80000 00000000H 存放到了&x 开始的 8 个
字节中。即&x 中为其低 32 位的 00000000H,&y 中为高 32 位的 BFF80000H 中的低 16 位 0000H,
&z 中为高 32 位的 BFF80000H 中的高 16 位 BFF8H。如上右图所示。
因此,最终打印的结果如下:x=0, z=-16392。
(3)只要将文件 proc1.c 中的第 1 行修改为“static double x;”就可以使得 proc1 中的 x 设定为本地变
量,从而在 proc1.o 的.data 节中专门分配存放 x 的 8 个字节空间,而不会和 main 中的 x 共用同
一个存储地址。因此,也就不会破坏 main 中 x 和 z 的值。
a) main.c 文件
b) proc1.c 文件
1 double x;
2
3 void proc1()
4 {
5 x=-1.5;
6 }
1 #include <stdio.h>
2 unsigned x=257;
3 short y, z=2;
4 void proc1(void);
5 void main()
6 {
7 proc1();
8 printf(“x=%u,z=%d”, x, z);
9 return 0;
10 }
资源评论
一筐猪的头发丝
- 粉丝: 62
- 资源: 315
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功