C语言中数组与同内存大小的指针sizeof结果为何不同
问题现象解释
sizeof是C语言的编译期运算符(仅对可变长数组操作时为运行期计算),它的计算结果仅由操作数的类型决定,和操作数指向的内存空间实际大小无关,两个输出的差异原因如下:
- 对于
arr:它是长度为4的int类型数组,你的环境中int占4字节,所以数组类型本身的总大小为4 * 4 = 16字节。另外数组名在作为sizeof的操作数时不会退化为指针,会保留数组的类型属性,因此sizeof arr输出16。 - 对于
crr:它是int *类型的指针变量,在64位架构下,所有类型的指针变量本身占用的空间都是8字节,sizeof crr计算的是指针变量自身的类型大小,和你通过malloc为它分配了多大的指向空间完全无关,因此输出8。
补充说明
- 标准C没有提供可移植的方法获取
malloc分配的内存块大小,部分平台提供了扩展接口(例如Linux下的malloc_usable_size()),但这类接口不具备跨平台性,且返回值可能大于申请的大小(受内存对齐机制影响)。 - 数组名仅在两种场景下不会退化为指向首元素的指针:一是作为
sizeof的操作数,二是作为取地址运算符&的操作数,其余所有场景数组名都会自动转换为指针类型。
内容的提问来源于stack exchange,提问作者taurus05
相关产品推荐
相关产品推荐

