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

C语言中int数组转char指针问题:为何strlen结果为5?

为何变量a结果为5?int数组转char*的逻辑解析
int v_1[10] = { -1,1000,2 };

int a;

a = strlen(((char*)v_1 + 1));

关键前提

  • Windows平台采用小端字节序,int类型占4字节;
  • strlen()函数的作用是:从指针指向的位置开始,统计连续的非0字节数量,直到遇到第一个字节值为0(即'\0')时停止,且不包含这个0字节。

数组v_1的内存布局(小端存储)

把每个int元素拆成单个字节看:

  • v_1[0] = -1:在4字节int中,-1的补码是全1,即0xFFFFFFFF,内存中字节顺序为 0xFF 0xFF 0xFF 0xFF;
  • v_1[1] = 1000:转十六进制是0x000003E8,小端存储会把低位字节放前面,所以内存中是 0xE8 0x03 0x00 0x00;
  • v_1[2] = 2:十六进制0x00000002,小端存储为 0x02 0x00 0x00 0x00;
  • 数组未初始化的元素默认是0,但这里统计到第一个0就停止,所以不用管后面。

指针转换与偏移的意义

  • (char*)v_1:把int数组的首地址强制转换为char指针。原本int指针每次移动1步是4字节(对应一个int元素),而char指针每次移动1步是1字节,这样就能逐个访问数组内存中的每一个字节。
  • (char*)v_1 + 1:从数组首地址向后偏移1个字节,指向v_1[0]的第二个字节(值为0xFF)。

计算strlen的结果

从偏移后的位置开始逐个遍历字节:

  1. 0xFF(v_1[0]第二个字节)
  2. 0xFF(v_1[0]第三个字节)
  3. 0xFF(v_1[0]第四个字节)
  4. 0xE8(v_1[1]第一个字节)
  5. 0x03(v_1[1]第二个字节)

下一个字节是0x00(v_1[1]第三个字节),这是第一个遇到的'\0',统计停止。所以总共有5个非0字节,a的值就是5。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:33:16