提问者:小点点

为什么sizeof运算符会为数组产生不同的结果


为什么sizeof运算符只应该是4个字节却生成12个字节?当我引用变量array时,这只是引用数组第一个索引的内存地址。实际上,我打印了第一个索引&array[0]的内存地址,并将其与array进行了比较,它们产生了相同的内存地址结果,这证实了它们都引用了数组的第一个索引,但是“array”产生了12个字节,而array[0]产生了4个字节。

int main() {
int array[] = {1,2,3};
int a = 1;
int b = sizeof(array); //this is referring to the first index of the array
int c = sizeof(array[0]); //this is also referring to the first index of the array

std::cout << b << std::endl;
std::cout << array << std::endl; //they have the same memory address
std::cout << &array[0] << std::endl; /* they have the same memory address, which confirms that array 
and &array[0] is the same */

return 0;
}

共1个答案

匿名用户

数组和指针是不同的,这是一个主要的例子。

在大多数上下文中,数组衰减为指向其第一个成员的指针。不发生这种衰减的少数几次之一是当数组是sizeof运算符的主题时。在这种情况下,它引用整个数组,表达式的计算结果为整个数组的大小(以字节为单位)。

C标准第6.3.2.1P3节对此进行了描述:

除非它是sizeof运算符、_alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为“array of type”的表达式将转换为类型为“Pointer to type”的表达式,该表达式指向数组对象的初始元素,而不是Lvalue。如果数组对象具有register storage类,则该行为未定义。

以及第7.2节中的C++11标准:

类型为“N t的数组”或“t的未知界的数组”的lvalue或rvalue可以转换为类型为“指向t的指针”的prvalue。应用临时物化转换(7.4)。结果是指向数组第一个元素的指针。

和8.3.3p4:

LVALUE到RVALUE(7.1)、数组到指针(7.2)和函数到指针(7.3)标准转换不应用于sizeof的操作数。如果操作数是prvalue,则应用临时物化转换(7.4)。

所以我们实际拥有的是:

int b = sizeof(array);     // size of the entire array
int c = sizeof(array[0]);  // size of the first element of the array
int d = sizeof(&array[0]); // size of a pointer to an array element