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

看板C_and_CPP作者 ( )時間9年前 (2014/12/02 18:03), 9年前編輯推噓8(8030)
留言38則, 12人參與, 最新討論串1/1
(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) 意思為??? ----------------------------------------------------- (B) struct AA { char a:1; char b:2; char c:3; }; 首先我沒看過char a:1 的這種寫法? 這是代表什麼意思 ? 還有為何 sizeof(AA) 會是1 ? ------------------------------------------------------ (C) int a[5] = {1,2,3,4,5}; int *p = *(&a + 1); 這裡我有點不解 &a 和 &a[0] 是相同的記憶體位置 (&a + 1) 我以為是 a 後面一格的記憶體位置(也就是 &a[1]) 但卻不是 我用devC++ 檢察反而是 a[5]的記憶體位置 ? 而a[5]的內容未定義 這我不大了解? ----------------------------------------------------------- 懇請賜教 ※ 編輯: caxz (60.245.65.182), 12/02/2014 18:17:38

12/02 18:20, , 1F
1.遠程指標
12/02 18:20, 1F

12/02 18:20, , 2F
2.bit的寫法,不足1byte,以1byte算
12/02 18:20, 2F

12/02 18:30, , 3F
不是遠程指標 只是單純的long* 遠程指標是far
12/02 18:30, 3F

12/02 18:31, , 4F
第一題我覺得你出去深呼吸兩下 喝個冰水回來就看懂了
12/02 18:31, 4F

12/02 18:31, , 5F
s是char* 硬轉成long*, +2代表移動兩個sizeof(long)
12/02 18:31, 5F

12/02 18:32, , 6F
c: 加整個 array size
12/02 18:32, 6F

12/02 18:33, , 7F
最後再取值*(...) 這樣看懂了嗎?
12/02 18:33, 7F

12/02 18:34, , 8F
:1 :2有點太細,他是指定該變數吃幾個bit
12/02 18:34, 8F

12/02 18:34, , 9F
以及怎麼排列,這個例子是POD,會按順序排列
12/02 18:34, 9F

12/02 19:42, , 10F
可是第一題*((long*)s+2) 的結果是14648 這又是為何?
12/02 19:42, 10F

12/02 20:13, , 11F
@caxz: 0x00003938 = 14648, 32位元long*等於4個byte, 所以
12/02 20:13, 11F

12/02 20:14, , 12F
*(long*)s=0x33323130, 0x30等於'0', 0x31等於'1',依此類推
12/02 20:14, 12F

12/02 20:15, , 13F
"0123"四個byte就變成0x30313233,little-endian就反過來
12/02 20:15, 13F

12/02 20:17, , 14F
依此類推*((long*)s+2)指到最後"89\0",再多一個'\0'是湊巧
12/02 20:17, 14F

12/02 20:17, , 15F
不過陣列宣告用堆疊記憶體,一般都會多配置空間,所以多'\0'
12/02 20:17, 15F

12/02 20:18, , 16F
的湊巧幾乎總是會發生。
12/02 20:18, 16F

12/02 20:46, , 17F
哪間呀@@,不是頗簡單
12/02 20:46, 17F

12/02 21:02, , 18F
另外一種想法是CPU賦值到記憶體還是以4或8bytes來對齊,所以
12/02 21:02, 18F

12/02 21:03, , 19F
底層會多個'\0'是必然的。總之,大概是這些原因。
12/02 21:03, 19F

12/02 21:58, , 20F
3.指標加一是跳一整個a陣列的大小 前幾個禮拜版上有人問
12/02 21:58, 20F

12/02 23:08, , 21F
1.long size depends on system
12/02 23:08, 21F

12/02 23:11, , 22F
2.bit field 3.&a 的 type 是 int [5]
12/02 23:11, 22F

12/02 23:19, , 23F
講錯了,a 的 type 是 int[5] 所以 &a 是 int (*) [5]
12/02 23:19, 23F

12/02 23:21, , 24F
先讀熟 K&R 吧,還蠻基本的
12/02 23:21, 24F

12/03 01:39, , 25F
第一題其實是 undefined behavior
12/03 01:39, 25F

12/03 09:28, , 26F
因為endian的關係對吧,我之前漏了這點 XD
12/03 09:28, 26F

12/03 09:29, , 27F
另外除了C出得還不錯以外 其他兩題都有點太魯小了
12/03 09:29, 27F

12/03 12:42, , 28F
除了endian,直接cast指標可能違反alignment
12/03 12:42, 28F

12/03 18:07, , 29F
有時候不大懂考偏冷寫法的考官動機是什麼
12/03 18:07, 29F

12/03 18:08, , 30F
語法在那但是正常寫程式不會跟自己過不去
12/03 18:08, 30F

12/04 05:34, , 31F
炫耀
12/04 05:34, 31F

12/04 05:36, , 32F
只要能達到效果都是好程式,不需要寫成這樣
12/04 05:36, 32F

12/04 08:42, , 33F
問題只在於有些寫法標準都告訴你不一定會達成效果
12/04 08:42, 33F

12/04 08:42, , 34F
但一堆人還是寫的很高興...
12/04 08:42, 34F

12/04 17:54, , 35F
C 的題目 int *p = *(&a+1) 是不是等於 int *p = a+1
12/04 17:54, 35F

12/04 18:05, , 36F
不是
12/04 18:05, 36F

12/04 18:11, , 37F
要看a的type是什麼
12/04 18:11, 37F

12/04 18:12, , 38F
精確地說 要看sizeof(a)是否等於sizeof(int)
12/04 18:12, 38F
文章代碼(AID): #1KVOvnwp (C_and_CPP)