【问题标题】:sizeof operator on array name when offset is added添加偏移量时数组名称上的 sizeof 运算符
【发布时间】:2018-03-29 01:45:30
【问题描述】:

我很好奇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 被视为地址。当我们将数组传递给函数时,这种行为可能会导致错误,初学者总是对此有疑问。

【问题讨论】:

  • arrayName + offset 导致arrayName 降级为指针,所以是的,这是明确定义的。是的,数组降级为指针的这种行为让初学者感到困惑;当你建造你的时间机器时,我建议在 1969 年左右拜访丹尼斯·里奇,并告诉他不要这样做。 :-)
  • "数组名实际上是 C 中的常量指针" - 否

标签: c arrays sizeof mingw32


【解决方案1】:

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

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

这在C standard 的第 6.3.2.1 节中有详细说明:

3 除非它是sizeof 运算符、_Alignof 运算符或一元& 运算符的操作数,或者是字符串 用于初始化数组的字面量,一个具有 type "array of type" 被转换为类型为 "pointer" 的表达式 to type" 指向数组的初始元素 对象并且不是左值。如果数组对象有 注册存储类,行为未定义。

对于sizeof(arrayName + offset)sizeof 的操作数是表达式arrayName + offset。该表达式的类型是指针类型,因为arrayName 被转换为指针以便与offset 执行指针运算。所以sizeof 表达式的计算结果是指针的大小。

sizeof(arrayName) 的情况下,sizeof 的操作数是一个数组,因此它计算为数组的大小(以字节为单位)。

这两种行为都被 C 标准很好地定义了。

【讨论】:

    猜你喜欢
    • 2017-10-30
    • 2021-09-24
    • 1970-01-01
    • 2021-05-22
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多