慣例,這筆試題也是一個讀者朋友發給個人,簡單看了下,並不以爲這是一個很是困難的題目,最近是校招準備的時候,不少人給我說發麪試題對你們有幫助。面試
這個題目面試官強調了這個跑在64位系統下。app
代碼以下:ide
#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;
}
咱們有必要討論下這個問題,指針的大小,既然要討論指針的大小,就要說下,指針是什麼東西,看我以前文章的人應該都知道,指針就是地址,地址那就和機器的地址線「有不一樣意見能夠留言」有關係。spa
若是是16位機器,咱們須要保存一個地址就須要2個字節,因此一個指針的大小就是2bytes.若是是32位機器,咱們須要保存一個地址就須要4個字節,因此一個指針的大小就是4bytes.若是是64位機器,咱們須要保存一個地址就須要8個字節,因此一個指針的大小就是8bytes.指針
而後咱們再討論下,咱們平時說的32位機,64位機,咱們指的是它的地址線個數仍是數據線個數呢?code
提醒下orm
咱們平時在64位機上的指針大小也是4個字節,主要是爲了兼容32位的機器,若是真的想讓指針在64位系統機器佔用8個字節,須要作某些設置。ci
因此你以爲上面的程序輸出啥?咱們能夠先看看這個代碼輸出了啥it
#include "stdio.h"
int main()
{
int i = 3;
printf("%d\n",i++*3+1);
return 0;
}
這個涉及考察 「++i」和「i++」在執行順序。io
輸出:
10
--------------------------------
Process exited after 0.08891 seconds with return value 0
請按任意鍵繼續. . .
咱們展開上面的代碼
a = mal(i++, sizeof(b) + 5);
展開
a = i++*sizeof(b)+5;
由於咱們在32系統裏面,sizeof(char**) = 4
i++*sizeof(b)+5
3 * 4 * 5 * 6 + 5
輸出:
365面試的時候怎麼說?
--------------------------------
Process exited after 0.1062 seconds with return value 0
請按任意鍵繼續. . .
若是面試的時候,你能把這個過程說出來給面試官說清楚,而且能講提到雖然是64位系統,可是由於須要兼容32位程序,指針的大小仍是 4字節的,當你講到這裏,面試官不知道有多喜歡你了。
文章來源於嵌入式Linux ,做者寫代碼的籃球球癡