1. 程式人生 > >閑來無事看兩個好玩的C語言面試題

閑來無事看兩個好玩的C語言面試題

當前 下午 沒有 fontsize 機器 比較 linu 需要 -s

昨天最後一天工作日,讓我碰到了兩個有意思的C語言編程問題,周末前權當輕松一下,挺有意思就過去了,因為今晚雨夜通宵,就把它們記錄了下來。

事件1:關於結構體對齊和packed屬性

下午跟同事下樓抽煙,聊到一個有意思的問題,不講故事了,直接看問題:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct data{
        char a;
        int b;
};

int main()
{
        char *mem = calloc(1, 100);
        struct
data *dt; memset(mem, ‘c‘, 1); memset(mem+1, 2, 1); memset(mem+2, 0, 99); dt = (struct data*)mem; printf("%c %d\n", dt->a, dt->b); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

很多人用這種方法給進行數據轉換,想當然會認為a就是’c’,b在小端機器上就是2,大端機器上則是0x02000000,嗯,還不錯,知道大小端。但是答案還是錯了。

其實struct dt的size是8,並不是1+4=5,結構體默認被對齊了,所有在字段a後面會有3個字節的填充,如果直接用mem強轉,那麽3個填充的0恰好覆蓋掉預期中的2,造成結果的錯誤。上面的代碼正確答案應該是:c 0

如果你把結構體dt定義成:

struct data{
        char a;
        char c;
        int b;
}
  • 1
  • 2
  • 3
  • 4
  • 5

就知道那個丟失的2去哪裏了。

如果希望達到預期的c 2,則只需要如下定義結構體即可:

struct data{
        char a;
        int b;
}__attribute__((packed));
  • 1
  • 2
  • 3
  • 4

這種問題在CPU和網絡協議以及持久層序列化之間的矛盾處理中非常常見。畢竟不管是網絡帶寬也好還是存儲介質也罷,每一個字節都是錢,能少一個字節甚至一個bit都是在節約,然而對於CPU而言,時間就是錢,空間反而不重要,所以CPU傾向於內存的對齊,於是乎CPU在處理網絡協議頭的時候非常容易犯上面的錯,當前的Linux內核一般都不用結構體強轉,都是手工轉換,對於序列化程序而言,更是有諸如XML,json等上層庫可用,免去了程序員的很多工作。

事件2:關於編譯期的sizeof

周五下班早,這是在下班的路上被人懟的:
技術分享圖片
說實話,這個問題我不會,瞬間感覺被鄙視,然而我本來就承認自己不會編程,也就無所謂了。好在我有手機雲編譯器,就試了一下:
技術分享圖片

然後,我用這個問題調侃了朋友圈的幾乎所有同行,當然除了前領導,現領導以及業界的比較牛的人,網上能搜到名字的人我也不敢調侃,這些人如果回答對了,顯得我毫無水平且具有挑釁性情,萬一回答不出來,我還想混呢…而且我怕被打…其他同等級別同等水平的就無所謂了,反正就是經常互相調侃,我這不就是被調侃的嗎?

果然啊,不出所料,有人回答5,有人回答6,當然回答6的偏多。哈哈, 很多人跟我一樣不會編程…我也就沒什麽覺得悲哀的了。

後來通過詢問以及自己手機查找資料,知道了答案。

sizeof是一個編譯期間預處理就決定結果的操作,編譯期肯定不會執行任何語句,i++也好,++i也罷,都不會執行,到了運行期,sizeof的結果已經有了,就更不會去執行i++了…

後來朋友圈的回復不斷,有人挖出了C語言標準,有人挖出了匯編碼,有人挖出了編譯器規程,不過最有意義的還是下面的圖了:
技術分享圖片


就上面兩個題目,面試的時候去問,相信大批量的人回答不對。但是這兩個問題其實也就是知道了也就知道了,並沒有什麽一錘定音的功能,萬萬不能用這些問題去評價某個人,它們只是檢測一個人對C語言的熟悉程度而已,編程者的事情知道的不多,不多說。


順便一說,我學過譚浩強的書,但學的不好。

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

閑來無事看兩個好玩的C語言面試題