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

时间:2018-03-29 01:45:31

标签: c arrays mingw32

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

1 个答案:

答案 0 :(得分:6)

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

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

详见[{3}}:

的第6.3.2.1节
  

3 除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,否则为字符串   用于初始化数组的文字,一个具有的表达式   type"类型数组"转换为类型为"指针的表达式   输入"指向数组的初始元素   对象并不是左值。如果数组对象有   注册存储类,行为未定义。

sizeof(arrayName + offset)的情况下,sizeof的操作数是表达式arrayName + offset。此表达式的类型是指针类型,因为arrayName被转换为指针以便使用offset执行指针算术。因此sizeof表达式的计算结果为指针的大小。

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

这两种行为都是由C标准明确定义的。