代码之家  ›  专栏  ›  技术社区  ›  Matt Joiner

当sizeof(char)!=1.

  •  1
  • Matt Joiner  · 技术社区  · 15 年前

    如何以单字节精度可移植地执行指针算法?

    请记住:

    • char 并非所有平台上都是1字节
    • sizeof(void) == 1 仅在GCC中作为扩展提供
    7 回复  |  直到 15 年前
        1
  •  21
  •   caf    15 年前

    你的假设有缺陷- sizeof(char) 定义

    C99 standard (TC3) ,在第6.5.3.4节(“运营商的规模”):

    (第2款)

    (以字节为单位)的操作数,可以 是一种表达还是一种表达 类型的括号名称。

    当应用于具有 键入char、unsigned char或signed char char(或限定版本)

    当这些结合在一起时,很明显,在C中,无论字符大小如何,该大小都是一个“字节”(即使在某些给定平台上超过8位)。

    A. char 因此是最小的可寻址类型。如果您需要以小于 烧焦 ,你唯一的选择就是阅读 烧焦 烧焦 你想要的。

        2
  •  6
  •   Tim Robinson    11 年前

    sizeof(char) 始终返回1, in both C and C++ . A. char

        3
  •  3
  •   sharptooth    15 年前

    按照标准 char

        4
  •  3
  •   Alok Singhal    15 年前

    sizeof(char) 保证 1 char 使用9位或更多。

    因此,您可以:

    type *pt;
    unsigned char *pc = (unsigned char *)pt;
    

    和使用 pc 为了算术。 分配 pt

    超过8位宽,您无法在portable(ANSI/ISO)C中执行字节精度指针算法。在这里 ,我是说8位。这是因为基本类型本身大于8位。

        5
  •  1
  •   Vincent Gable    15 年前

    uintptr_t . 这将是指针大小的无符号整数。现在对它执行算术运算,然后将结果转换回要取消引用的类型的指针。

    intptr_t 签名,这通常不是你想要的!坚持下去比较安全 uintptr\t 除非你有充分的理由不这样做!)

        6
  •  1
  •   AnT stands with Russia    15 年前

    sizeof(void) char 在C语言中,理论上可能由1个以上的底层机器字节组成 sizeof(char) 是1,并且总是正好是1。换句话说,从C语言的角度来看, 烧焦 sizeof(无效) void * char * 指针,这意味着如果在某个平台上 煤焦* 那对你不管用 也不适合你。

    如果在某个平台上 烧焦 烧焦 烧焦 烧焦 . 再一次 烧焦

        7
  •  0
  •   kgiannakakis    15 年前

    C99标准定义了一个字节长的uint8。如果编译器不支持此类型,可以使用typedef定义它。当然,您需要一个不同的定义,具体取决于平台和/或编译器。将所有内容捆绑在头文件中,并在任何地方使用它。