看看大疆的C語言面試題

慣例,這筆試題也是一個(gè)讀者朋友發(fā)給我的,簡單看了下,并不覺得這是一個(gè)非常困難的題目,最近是校招準(zhǔn)備的時(shí)候,很多人給我說發(fā)面試題對大家有幫助。
這個(gè)題目面試官強(qiáng)調(diào)了這個(gè)跑在64位系統(tǒng)下。
代碼如下:
#define mal(x,y) (x*y)int main(){int i = 3;int a;char **b[5][6];a = mal(i++, sizeof(b) + 5);printf("%d", a);return 0;}
怎么確定指針大???
我們有必要討論下這個(gè)問題,指針的大小,既然要討論指針的大小,就要說下,指針是什么東西,看我之前文章的人應(yīng)該都知道,指針就是地址,地址那就和機(jī)器的地址線「有不同意見可以留言」有關(guān)系。
如果是16位機(jī)器,我們需要保存一個(gè)地址就需要2個(gè)字節(jié),所以一個(gè)指針的大小就是2bytes. 如果是32位機(jī)器,我們需要保存一個(gè)地址就需要4個(gè)字節(jié),所以一個(gè)指針的大小就是4bytes. 如果是64位機(jī)器,我們需要保存一個(gè)地址就需要8個(gè)字節(jié),所以一個(gè)指針的大小就是8bytes.
然后我們再討論下,我們平時(shí)說的32位機(jī),64位機(jī),我們指的是它的地址線個(gè)數(shù)還是數(shù)據(jù)線個(gè)數(shù)呢?
提醒下
我們平時(shí)在64位機(jī)上的指針大小也是4個(gè)字節(jié),主要是為了兼容32位的機(jī)器,如果真的想讓指針在64位系統(tǒng)機(jī)器占用8個(gè)字節(jié),需要做某些設(shè)置。
所以你覺得上面的程序輸出啥?
我們可以先看看這個(gè)代碼輸出了啥
#include "stdio.h"int main(){int i = 3;printf("%d\n",i++*3+1);return 0;}
這個(gè)涉及考察 「++i」和「i++」在執(zhí)行順序。
輸出:
10--------------------------------Process exited after 0.08891 seconds with return value 0請按任意鍵繼續(xù). . .
我們展開上面的代碼
a = mal(i++, sizeof(b) + 5);展開
a = i++*sizeof(b)+5;因?yàn)槲覀冊?2系統(tǒng)里面,sizeof(char**) ?= 4
i++*sizeof(b)+53 * 4 * 5 * 6 + 5
輸出:
365--------------------------------Process exited after 0.1062 seconds with return value 0請按任意鍵繼續(xù). . .
面試的時(shí)候怎么說?
如果面試的時(shí)候,你能把這個(gè)過程說出來給面試官說清楚,并且能講提到雖然是64位系統(tǒng),但是因?yàn)樾枰嫒?2位程序,指針的大小還是 4字節(jié)的,當(dāng)你講到這里,面試官不知道有多喜歡你了。

