int v_1[10] = { -1,1000,2 };
int a;
a = strlen(((char*)v_1 + 1));
我无法理解为什么在这种特殊情况下“a”变量等于 5。
我也在努力掌握 char* 的类型转换行为。我不明白我是否缺少一些类型转换的计算,因为我无法以任何方式得到 5。
我尝试修改数组中的值,但我无法辨别导致结果的原因。
我正在 Windows 平台上工作。
a
的值在很大程度上取决于您运行它的系统。大概在这种情况下,您使用的系统中 sizeof int
等于 4,并且整数以小端存储。
一个简单的程序可以以十六进制显示数据内容:
#include <stdio.h>
int main(void)
{
int v_1[10] = { -1,1000,2 };
for (size_t i = 0; i < sizeof v_1; i++) {
if (i > 0 && i % 4 == 0) printf(" "); // add a space every 4 bytes
printf("%02hhx", *((char*)v_1 + i));
}
printf("\n");
}
输出(在具有 4 字节小端整数的系统上):
ffffffff e8030000 02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
现在,你的问题是为什么
strlen(((char*)v_1 + 1));
等于 5。要回答这个问题,请再次查看输出:
ffffffff e8030000
^
This position is (char*)v_1 + 1
您可以看到
strlen
在到达 NUL 字节之前将跨过五个字节 (ff ff ff e8 03
),NUL 字节是分隔字符串结尾的字节。这就是为什么在您的系统上您会得到值 5。