为什么int指针的大小与int数组的大小不同?

时间:2017-01-17 14:32:02

标签: c arrays pointers sizeof

让我们以下代码:

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)返回代表数组的内存块的大小?

感谢。

2 个答案:

答案 0 :(得分:12)

tint[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   具有类型''数组类型''的表达式将转换为   带有''指向类型'的指针的表达式,指向初始值   数组对象的元素,而不是左值。如果是数组对象   有寄存器存储类,行为未定。

相关问题