小端机器上int数组转char*后调用strlen为何返回5而非预期的4?
问题分析与解答
先看你的代码:
int v[10] = {-1, 1000, 2}; int a; a = strlen((char *)v+1); printf("strlen result for (char *) v+1: %d\n", a);
在32位小端机器上,strlen返回5的原因要从内存字节布局和strlen的工作原理说起:
小端模式下int的字节存储
- 32位int的
-1补码是0xFFFFFFFF,小端存储时字节顺序为:0xFF 0xFF 0xFF 0xFF(低字节在前) - 1000的十六进制是
0x000003E8,小端存储字节顺序:0xE8 0x03 0x00 0x00 - 2的十六进制是
0x00000002,小端存储字节顺序:0x02 0x00 0x00 0x00
- 32位int的
指针指向的起始位置
(char *)v+1是将数组首地址转为char指针后,向后偏移1个字节,指向第一个int元素的第二个字节,也就是内存序列中的第二个0xFF。strlen的计数逻辑
strlen会从起始指针开始逐个字节扫描,直到遇到第一个值为0x00的字节(即字符串结束符'\0'),返回扫描过的字节数(不包含'\0')。从起始位置开始的字节序列依次是:
0xFF→0xFF→0xFF→0xE8→0x03→0x00
前5个字节都不是0x00,第6个字节才是,所以strlen返回5。
你之前认为应该返回4,大概率是错误估算了第一个0x00出现的位置,或者对小端存储的字节顺序理解有误。
内容的提问来源于stack exchange,提问作者Santo
相关产品推荐
相关产品推荐

