Q7.1 在Intel X86系統上,使用Linux,若是執行一個輸出「hellow world"的程序但不調用exit或者return,則程序返回的代碼爲13,(用shell檢查),解釋其緣由。shell
由於hellow world 一共是13個字符,最後的$?值是printf("hellow world\n"); 後的值。 數組
若是打印21個字符最後返回碼就是21. ide
[root@clstore3 ~]# ./hello_world函數
hellow world zhangbospa
[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 = #
if ( val == 0 ) {
int val;
vlan = 5;
ptr = &val;
}
return ( *ptr +1);
}