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

参见英文答案 > How to find the ‘sizeof’ (a pointer pointing to an array)?                                    13个
让我们以下代码:

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 t[3];

然后sizeof(t)产生一个等于3 * sizeof(int)的值

C标准(6.5.3.4 sizeof和alignof运算符)

2 The sizeof operator yields the size (in bytes) of its operand,

实际上,一个包含三个int类型元素的数组占用内存,以字节为单位,等于3 * sizeof(int).

在少数例外的表达式中,因为在sizeof运算符中使用数组指示符将转换为指向其第一个元素的指针.

因此,如果您将使用例如以下表达式

sizeof( t + 0 )

那么表达式t 0中的t将转换为指针,你将得到sizeof(t 0)等于你平台上指向int的指针的大小,即8.

来自C标准(6.3.2.1 Lvalues,数组和函数指示符)

3 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.

相关文章
相关标签/搜索