在 C 中从 int 数组转换为 char 指针

Casting from int array to char pointer in C

提问人:Sako 提问时间:10/12/2023 更新时间:10/12/2023 访问量:62

问:

int v_1[10] = { -1,1000,2 };

int a;

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

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

我也在努力掌握 char* 的类型转换行为。如果这是我缺少的排版的一些计算,我不会解开,因为我无法以任何方式获得 5。

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

我正在Windows平台上工作。

数组 C 指针 转换 strlen

评论

1赞 Dave S 10/12/2023
C 字符串是以零字节结尾的非零字节序列。你得到的方法是计算非零字节。这也是一件非常危险的事情,因为如果所有 int 数组字节都是非零的,strlen 函数将读取 int 数组的末尾,这是未定义的行为。
1赞 Gerhardh 10/12/2023
你的期望是什么,你应该从中得到什么?数组不是字符串。如果你没有字符串,那么字符串长度的概念根本不适用。strlenint

答:

4赞 paddy 10/12/2023 #1

的值很大程度上取决于您在哪个系统上运行它。据推测,在本例中,您使用的系统等于 4,整数存储在 little-endian 中。asizeof int

一个简单的程序可以以十六进制形式显示数据的内容:

#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

现在,你的问题是关于为什么等于 5。要回答这个问题,请再次查看输出:strlen(((char*)v_1 + 1));

ffffffff e8030000 
  ^
  This position is (char*)v_1 + 1

您可以看到,在到达 NUL 字节之前,它将单步执行五个字节 (),这是分隔字符串末尾的内容。这就是为什么在您的系统上,您获得值 5 的原因。strlenff ff ff e8 03