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

添加偏移量时数组名称上的sizeof运算符

  •  0
  • Rajesh  · 技术社区  · 6 年前

    我很好奇 sizeof(arrayName + offset) 。它给了我 sizeof(pointer) 。虽然数组名在C中实际上是一个常量指针, sizeof(arrayName) 给出数组的大小(以字节为单位)。所以我猜编译器 (arrayName+offset) 作为纯指针 sizeof() 因此,使用数组名称时唯一的例外是 sizeof(arrayName)

    这种行为 sizeof(arrayName+offset) 编译器定义良好?我正在使用MinGW 32位编译器。 还有什么方法可以知道部分数组的大小,除了使用简单的数学 (sizeof(arrayName) - offset*sizeof(arrayName[0])) ?

    sizeof(arrayName) C/C++中不是一种不一致的语言结构吗?出于所有其他目的, arrayName 被视为地址。当我们将数组传递给函数时,这种行为可能会导致bug,初学者对此总是有疑问。

    1 回复  |  直到 5 年前
        1
  •  5
  •   Ry-    6 年前

    在除三种情况外的所有情况下,数组名称都会转换为指向其第一个元素的指针:

    • 运算符地址的操作数 &
    • 的操作数 sizeof 操作人员
    • 的操作数 _Alignof 操作人员

    详细信息请参见第6.3.2.1节 C standard :

    3. 除非它是 sizeof公司 操作员 _对齐 运算符或一元数 & 运算符,或是字符串 用于初始化数组的文本,该表达式具有 类型“array of type”转换为类型为“pointer”的表达式 键入“指向数组初始元素的” 对象,而不是左值。如果数组对象具有 注册存储类,行为未定义。

    假使 sizeof(arrayName + offset) ,的操作数 sizeof公司 是表达式 arrayName + offset 。此表达式的类型是指针类型,因为 arrayName 转换为指针,以便使用 offset 。所以 sizeof公司 表达式的计算结果为指针大小。

    假使 sizeof(arrayName) ,的操作数 sizeof公司 是一个数组,因此它计算为数组的大小(以字节为单位)。

    C标准对这两种行为都有很好的定义。