[討論] 面試時碰到的幾個C語言問題

作者: caxz ( )   2014-12-02 18:03:26
(A) 請問以下的code:
char s[11] = "0123456789" ;
cout<< "(1) *(s+2) = "<< *(s+2) <<endl;
cout<< "(2) *((long*)s+2) = "<< *((long*)s+2) <<endl<<endl;
我不懂 *((long*)s+2) 意思為???
作者: johnpage (johnpage)   2014-12-02 18:20:00
1.遠程指標2.bit的寫法,不足1byte,以1byte算
作者: Killercat (殺人貓™)   2014-12-02 18:30:00
不是遠程指標 只是單純的long* 遠程指標是far第一題我覺得你出去深呼吸兩下 喝個冰水回來就看懂了s是char* 硬轉成long*, +2代表移動兩個sizeof(long)
作者: descent (「雄辯是銀,沉默是金」)   2014-12-02 18:32:00
c: 加整個 array size
作者: Killercat (殺人貓™)   2014-12-02 18:33:00
最後再取值*(...) 這樣看懂了嗎?:1 :2有點太細,他是指定該變數吃幾個bit以及怎麼排列,這個例子是POD,會按順序排列
作者: caxz ( )   2014-12-02 19:42:00
可是第一題*((long*)s+2) 的結果是14648 這又是為何?
作者: dirkc (3781615)   2014-12-02 20:13:00
@caxz: 0x00003938 = 14648, 32位元long*等於4個byte, 所以*(long*)s=0x33323130, 0x30等於'0', 0x31等於'1',依此類推"0123"四個byte就變成0x30313233,little-endian就反過來依此類推*((long*)s+2)指到最後"89\0",再多一個'\0'是湊巧不過陣列宣告用堆疊記憶體,一般都會多配置空間,所以多'\0'的湊巧幾乎總是會發生。
作者: MIKEmike07 (加油!)   2014-12-02 20:46:00
哪間呀@@,不是頗簡單
作者: dirkc (3781615)   2014-12-02 21:02:00
另外一種想法是CPU賦值到記憶體還是以4或8bytes來對齊,所以底層會多個'\0'是必然的。總之,大概是這些原因。
作者: tsoahans (ㄎㄎ)   2014-12-02 21:58:00
3.指標加一是跳一整個a陣列的大小 前幾個禮拜版上有人問
作者: ACMANIAC (請肥宅救救肥宅)   2014-12-02 23:08:00
1.long size depends on system2.bit field 3.&a 的 type 是 int [5]講錯了,a 的 type 是 int[5] 所以 &a 是 int (*) [5]先讀熟 K&R 吧,還蠻基本的
作者: littleshan (我要加入劍道社!)   2014-12-03 01:39:00
第一題其實是 undefined behavior
作者: Killercat (殺人貓™)   2014-12-03 09:28:00
因為endian的關係對吧,我之前漏了這點 XD另外除了C出得還不錯以外 其他兩題都有點太魯小了
作者: littleshan (我要加入劍道社!)   2014-12-03 12:42:00
除了endian,直接cast指標可能違反alignment
作者: dirkc (3781615)   2014-12-03 18:07:00
有時候不大懂考偏冷寫法的考官動機是什麼語法在那但是正常寫程式不會跟自己過不去
作者: johnpage (johnpage)   2014-12-04 05:34:00
炫耀只要能達到效果都是好程式,不需要寫成這樣
作者: LPH66 (-6.2598534e+18f)   2014-12-04 08:42:00
問題只在於有些寫法標準都告訴你不一定會達成效果但一堆人還是寫的很高興...
作者: wenyonba (射後不理很XX啊!!!!)   2014-12-04 17:54:00
C 的題目 int *p = *(&a+1) 是不是等於 int *p = a+1
作者: purpose (秀才遇到肥宅兵)   2014-12-04 18:05:00
不是
作者: Killercat (殺人貓™)   2014-12-04 18:11:00
要看a的type是什麼精確地說 要看sizeof(a)是否等於sizeof(int)

Links booklink

Contact Us: admin [ a t ] ucptt.com