第7章 习题

习题

7.1 在intel x86系统上,使用linux,如果执行一个输出 “hello, world”的程序但不调用exit 或 return,则程序的返回代码为13(用shell检查),解释其原因。
“hello, world\n ” 共13个字符,而printf的返回值是输出的字符个数,这个返回值是存储在主函数的堆栈中的。当主函数的exit code处于未定义状态时,则其exit code由堆栈和寄存器决定。
这里写图片描述

7.2 图7-3 中的printf函数的结果何时才被真正输出
当进程与终端进行I/O时,标准输出使用行缓冲,行缓冲区遇到回车符才输出。

7.3 是否有办法不使用 参数传递 全局变量 这两种方法,将main中的参数argc argv传递给它所调用的函数。
将参数设置为环境变量。

7.4 在有些UNIX系统实现中执行时访问不到其数据段的0单元,这是一种有意的安排,为什么?
对空指针解引用dereference时,可以利用这种方式处理。

7.5 用C语言的typedef 为终止处理程序定义一个新的数据类型Exitfunc,使用该类型修改atexit的原型。
typedef int (*Exitfunc) (void (*func) (void) )

7.6 如果用calloc分配一个long型的数组,数组的初始值是否为0?如果用calloc分配一个指针数组,数组的初始值是否为空指针?
这里写图片描述

7.7 在7.6节结尾处size命令的输出结果中,为什么没有给出堆和栈的大小

7.8 为什么7.7节中两个文件的大小(879 443 和 8378)不等于它们各自文本和数据大小的和?
因为.out文件包含的不仅仅是数据和文本,还包括很多调试信息,symbol,section等。

7.9 为什么7.7节中对于一个简单的程序,使用共享库以后其可执行文件的大小变化如此巨大?
使用静态库时,链接器将二进制的库文件复制到原目标文件中。
而使用共享库时只是将函数调用表拷贝到原目标文件中。

7.10 在7.10节中我们已经说明为什么不能将一个指针返回给一个自动变量,下面的程序是否正确?

int
f1(int val)
{
int num = 0;
int *ptr = #
if (val == 0) {
int val;
val = 5;
ptr = &val;
}
return(*ptr + 1);
}

不正确,val的作用域位于if语句内,当if语句执行完成后,val就被释放,而ptr依然执行这个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值