Q7.1 在Intel X86系统上,使用Linux,如果执行一个输出“hellow world"的程序但不调用exit或者return,则程序返回的代码为13,(用shell检查),解释其原因。

因为hellow world 一共是13个字符,最后的$?值是printf("hellow world\n"); 后的值。 

如果打印21个字符最后返回码就是21. 

[root@clstore3 ~]# ./hello_world

hellow world zhangbo

[root@clstore3 ~]# echo $?

21

[root@clstore3 ~]# cat hellow_world.c

#include <stdio.h>

main ()

{

printf("hellow world zhangbo\n");

}


Q7.2 图7.3中的printf 函数的结果何时才能真正输出?

当程序是交互性的,标准输出是以行缓冲方式,所以当标准输出遇到换行符时,上次的结果才被真正的输出。 

当标准输出定向到一个文件时,标准输出是以全缓冲形式的,只有当标准I/O刷新是,标准输出结果才被真正的操作。 


Q.7.3 是否有方法不使用(a )参数传递,(b)全局变量这两种方法,将main 中的参数argc和argv传递给它所调用的其他函数?


Q7.4 有些 UNIX系统实现中执行程序时访问不到其数据段的0单元,这是一种有意的安排还是什么?

Some UNIX system implementations purposely arrange that, when a program is executed, location 0 in the data segment is not accessible. Why?

This provides a way to terminate the process when it tries to dereference a null pointer, a common C programming error. 


Q7.5 用C语言的typedef为终止处理程序定义了一个新的数据类型Exitfunc,使用该类型修改atexit的原型。


Q 7.6 如果使用calloc分配一个long型的数组,数组的初始值是否为0?如果使用calloc分配一个指针数组,数组的初始值是否为空指针?


Q7.7在7.6结尾出size命令的输出结果中,为什么没有给出堆栈的大小?

只有通过exec程序执行时,才会分配堆栈。 文件里面是没有堆栈的,堆栈是在内存里的分配的一块空间。 


Q7.8为什么7.7接种两个文件的大小(879443 he 8378)不等于他们各自文本和数据大小的和?

可执行文件除了文本和数据段大外,还包括符号表的段,包含调试信息的段以及包含动态共享库链表的段等。


Q 7.9 为什么7.7节中对于一个简单的程序,使用共享库以后可执行文件的大小变化如此巨大?

共享库使得可执行文件中不再需要包含公用的库函数,而在需要在所有进程都可以引用的存储区中保存这种库例程的一个副本。 这样是可执行的正文和数据段的长度显著减少。 


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

int

f1(int val)

{

  int num = 0;

 int *ptr = &num;

 if ( val == 0 ) {

   int val;

 vlan = 5;

 ptr = &val;

}


return ( *ptr +1);

}