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

本文解析了一道关于字符数组与整型指针相互作用的趣味编程题目。通过强制类型转换,整型指针指向字符数组的前四个元素,并修改其内容。最终打印结果为“4321efg”。文章详细解释了这一过程背后的内存布局和字节序原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

是這樣的:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值