1. 程式人生 > >C語言深度解剖最後測試題【答案】

C語言深度解剖最後測試題【答案】

答案

  1. “>6”

2.strcpy出問題,沒有/0

3.i=10,j=1;

4.除了sizeof(a)是400

5.255

6.
1)*p不能改,p可以改
2)*p不能改,p可以改
3)p不能改,*p可以改
4)*p和p都不能改

7.volatile關鍵字的作用:
防止變數被意外的改變,每次都要從記憶體中讀取。

8.5,2000000
//考慮大小端的問題,指標偏移一個位元組
int ptr2 = (int )((int)a+1);
這時a被強制轉換為整形(為不是int*型),所以地址值+1而不是+4
同時因為計算機是小端序,所以造成這樣
記憶體:

高地址
|---01---|<--a(陣列a首地址) |---00---|<--(*ptr2=0x02000000) |---00---| |---00---| |---02---| |---00---| |---00---| |---00---| |---03---| |---00---| 低地址

9.0x10

10.考察巨集替換

#define SQR(x) ((x)*(x))  
//因為巨集的本質是字串的替換,所以
//一定不能省了括號中的括號,避免出現優先順序問題
//比如SQR(1+2)時,得到的結果可能有問題

11.(1)佔12byte(2)佔8byte

12.

int *p = (int *)0x12ff7c;
*p = 0x100;
或者*(int*)0x12ff7c = 0x100;

13.2,5

14.
0x100014,
0x100001,//因為這裡轉換成unsigned long而不是指標
0x100004,

15.1 注意逗號運算子

16.不應該傳進去b[10],應該傳進去b

  1. char *name沒有分配空間

18.
0
1
2
5
10

19.getchar的返回值是int這可能造成問題

20.

//我自己寫的
int is_big_or_little()
{
    int i = 0x11223344
; char *p = (char *)&i; if(*p == 0x11) return 0;//大端序 else if(*p == 0x44) return 1;//小端序 else return -1;//錯誤 } //書上的答案 int checkSystem() { union check{ int i; char ch; }c; c.i = 1; return (c.ch == 1); }