让我们以下代码:
int x;
int *p = &x;
int t[3];
然后sizeof返回:
sizeof(x) -> 4
sizeof(p) -> 8
sizeof(t) -> 12
我认为sizeof(t)
是3 * sizeof(int)
的结果。
但由于t
是指向其第一个元素的指针,因此其大小应为sizeof(p)
。
为什么sizeof(t)
返回代表数组的内存块的大小?
感谢。
答案 0 :(得分:12)
t
是int[3]
类型,不是指针类型。
所以它的大小为3 * sizeof(int)
。
在某些情况下,t
将衰减到指针,但这不是其中一个。
答案 1 :(得分:8)
因为变量t
被声明为具有数组类型
int t[3];
然后sizeof( t )
产生的值等于3 * sizeof( int )
C标准(6.5.3.4 sizeof和alignof运算符)
2 sizeof运算符产生其操作数的大小(以字节为单位)
实际上,一个包含三个int
类型元素的数组占用内存等于3 * sizeof( int )
的内存。
在少数例外的表达式中,因为在sizeof
运算符数组中使用指定符将转换为指向其第一个元素的指针。
因此,如果您将使用例如以下表达式
sizeof( t + 0 )
然后表达式t
中的t + 0
将转换为指针,您将得到sizeof( t + 0 )
等于平台上指向int
的指针的大小,这是8
。
来自C标准(6.3.2.1 Lvalues,数组和函数指示符)
3 除非它是sizeof运算符的操作数或一元& operator,或者是用于初始化数组的字符串文字,a 具有类型''数组类型''的表达式将转换为 带有''指向类型'的指针的表达式,指向初始值 数组对象的元素,而不是左值。如果是数组对象 有寄存器存储类,行为未定。