代码之家  ›  专栏  ›  技术社区  ›  Sako

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

  •  0
  • Sako  · 技术社区  · 2 年前
    int v_1[10] = { -1,1000,2 };
    
    int a;
    
    a = strlen(((char*)v_1 + 1));
    

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

    我也很难理解将类型转换为char*的行为。我不知道是否有我错过的类型转换的计算,因为我无论如何都不能得到5。

    我试图修改数组中的值,但我无法辨别是什么导致了结果。

    我在Windows平台上工作。

    1 回复  |  直到 2 年前
        1
  •  3
  •   paddy    2 年前

    的值 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 将跨越五个字节( ff ff ff e8 03 )在到达NUL字节之前,NUL字节是字符串末尾的分隔符。这就是为什么,在你的系统中,你得到的值是5。