今天看了一道題,頗有些驚異

來源:互聯網
上載者:User

今天看了一道題,頗有些驚異。

是這樣的:

char str[] = "abcdefg";
int *ptr = (int *)str;//一
*ptr = 0x31323334;//二
printf("str=%s ", str);//三

 大夥兒認為如何?三處應該列印出什麼結果?

呵呵,是

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了。

說句題外話,這種題不能説是難,倒是偏門,如果你去面試他們有可能給你做這樣的題,但如果你真的進了那傢公司,公司肯定規定不準寫這樣的代碼。。。拿來考人,嚇唬人的,我不主張。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.