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