今天看了一道題,頗有些驚異。
是這樣的:




大夥兒認為如何?三處應該打印出什么結果?
呵呵,是
str=4321efg
什么原理?我們來看看。
str是一個含有8個char元素的數組,每個元素占1個字節;
ptr是個指向整型數據的指針,它所指向的東西將占4個字節(32位系統上),將str直接賦給ptr顯然是不行的,類型不匹配,要鎖強制轉換,所以一處就(int *)了。這樣下來是甚么後果?其結果是ptr指向的是從str開始的4個字節,即str、str + 1、str + 2、str + 3,也就是str[0]、str[1]、str[2]和str[3]。這4個元素ptr一下就都指到了——沒辦法,人家是整型的指針。那麽二処這樣一來是什麽後果呢?我們來看看内存的情況。。。假設str所致的内存地址是0x00 00 00 00,那麽str[1]、str[2]、str[3]就是0x 00 00 00 01、0x00 00 00 02、0x00 00 00 03,ptr值得地址是str所指的地址,也就是0x00 00 00 00,但它(ptr)的範圍是0x00 00 00 00到0x00 00 00 03。根據intel處理器小段排序,它會把0x31 32 33 34這樣一個大數的最低字節放在最高処,也就是ptr的最高処,即0x00 00 00 03,這個地址正好是str[3]的,於是把str[3]的内容覆蓋,寫成了0x31;以此類推0x00 00 00 02寫成了0x32,0x00 00 00 01寫成了0x33,0x00 00 00 00寫成了0x34,那麽數組str就成了這樣一種情況:0x34, 0x33, 0x32, 0x31, 'e', 'f', 'g', '/0'。0x34對應ASCII碼的4,所以用%s打印出來結果就是4321efg了。
說句題外話,這種題不能説是難,倒是偏門,如果你去面試他們有可能給你做這樣的題,但如果你真的進了那傢公司,公司肯定規定不准寫這樣的代碼。。。拿來考人,嚇唬人的,我不主張。