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的结果
从偏移后的位置开始逐个遍历字节:
0xFF(v_1[0]第二个字节)0xFF(v_1[0]第三个字节)0xFF(v_1[0]第四个字节)0xE8(v_1[1]第一个字节)0x03(v_1[1]第二个字节)
下一个字节是0x00(v_1[1]第三个字节),这是第一个遇到的'\0',统计停止。所以总共有5个非0字节,a的值就是5。
内容的提问来源于stack exchange,提问作者Sako
相关产品推荐
相关产品推荐

