[讨论] 面试时碰到的几个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