C 中从 int 数组到 char 指针的转换

问题描述 投票:0回答:1
int v_1[10] = { -1,1000,2 };

int a;

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

我无法理解为什么在这种特殊情况下“a”变量等于 5。

我也在努力掌握 char* 的类型转换行为。我不明白我是否缺少一些类型转换的计算,因为我无法以任何方式得到 5。

我尝试修改数组中的值,但我无法辨别导致结果的原因。

我正在 Windows 平台上工作。

arrays c pointers casting strlen
1个回答
0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.