为什么sizeof运算符为静态和动态数组返回不同的输出?

问题描述

请参见以下代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int arr[10];
    int *arr2;

    arr2=malloc(10*sizeof(int));

    printf("The size of arr is %lu \n",sizeof(arr));
    printf("The sice of arr2 is %lu \n",sizeof(arr2));
    return 0;

}

输出为:

The size of arr is 40  
The sice of arr2 is 8 

我知道arr包含数组中第一个元素的地址。
我的问题是:为什么sizeof()运算符对arr返回40,对arr2返回8? sizeof(arr)为何是40,因为它仅存储数组的第一个元素的地址?

解决方法

arr不包含数组第一个元素的地址。 arr 数组。在大多数情况下,它只是衰减为指向第一个元素的指针。

当数组名称是sizeof运算符的主题时,数组名称不会衰减的几次。在这种情况下,sizeof会得出数组大小(以字节为单位),在这种情况下为40。

另一方面,

arr2是指向int的指针,因此在其上使用sizeof可以得到系统上的指针大小为8。它不是它是否指向动态分配的数组,本地数组的开始或两者之中的某个位置无关紧要。 sizeof唯一要看的是其操作数的类型。实际上,除非其操作数是可变长度数组,否则sizeof会被评估为编译时间。

,

因为您所用的类型不同(int [10]与int *)。如果您保留相同的类型,则两者将返回相同的数字。

Nit:代替zu,使用zu打印size_t。

道德:sizeof不是函数,而是运算符。

,

sizeof是一个运算符,其大小可以在编译时解析。编译器不知道malloc将返回什么。它只会看到类型int arr[10];int *arr;并返回当前平台上类型的大小

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...