回复 楼主 yyjinlong
其实,第二道题是比较深入的C语言题,涉及面较广。在嵌入式上需要注意。
可以从底层一条一条解释:
首先,从计算机指令分析,一条指令流水线的取数环节,一般一个一个脉冲驱动;
其次,在取数过程中,根据指令带宽,如32位(4 byte),取数首地址一般为4的整数倍,如果不为4的整数倍,就涉及到跨段取数;
在大多数操作系统中,如果系统不进行处理,一般是不进行跨段取数,也不进行多次取数;
根据不同平台,处理结果如下例:
char ptr[12]={0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb};
int *ptr2=(int *)((int)ptr+5);
ptr2的值,在不同的平台上会是不同的表现, 默认为全部小端(little endian):
在win32上,系统处理了跨段问题, ptr2 值为0x5060708
在有些对齐处理平台上,ptr2值为0x4050607
在有些未对其处理平台上,ptr2值为0x5060704
有些未加保护处理平台上,就直接报segment fault。
你可以根据此原理,算算面试题。