You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

小端机器上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的工作原理说起:

  1. 小端模式下int的字节存储

    • 32位int的-1补码是0xFFFFFFFF,小端存储时字节顺序为:0xFF 0xFF 0xFF 0xFF(低字节在前)
    • 1000的十六进制是0x000003E8,小端存储字节顺序:0xE8 0x03 0x00 0x00
    • 2的十六进制是0x00000002,小端存储字节顺序:0x02 0x00 0x00 0x00
  2. 指针指向的起始位置
    (char *)v+1是将数组首地址转为char指针后,向后偏移1个字节,指向第一个int元素的第二个字节,也就是内存序列中的第二个0xFF。

  3. strlen的计数逻辑
    strlen会从起始指针开始逐个字节扫描,直到遇到第一个值为0x00的字节(即字符串结束符'\0'),返回扫描过的字节数(不包含'\0')。

    从起始位置开始的字节序列依次是:0xFF → 0xFF → 0xFF → 0xE8 → 0x03 → 0x00
    前5个字节都不是0x00,第6个字节才是,所以strlen返回5。

你之前认为应该返回4,大概率是错误估算了第一个0x00出现的位置,或者对小端存储的字节顺序理解有误。

内容的提问来源于stack exchange,提问作者Santo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:55