让我们以下代码:
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)
返回代表数组的内存块的大小?
谢谢.
t
是一种int[3]
类型,而不是指针类型.
所以它的大小是3 * sizeof(int)
.
在某些情况下,t
衰减到指针,但这不是那些实例之一.
由于变量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运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为''array of type''的表达式转换为类型为''指针的表达式键入''指向数组对象的初始元素,而不是左值.如果数组对象具有寄存器存储类,则行为未定义.