为什么 sizeof() 运算符 return 静态和动态数组的输出不同?

Why does sizeof() operator return different output for static and dynamic array?

请看下面代码:

#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() operator returns 40 for arr, and 8 for arr2?
为什么sizeof(arr)是40,因为它只是存储数组第一个元素的地址?

因为您的情况类型不同(int [10] 与 int *)。如果您保持类型相同,则两者将 return 相同的数字。

尼特:使用 zu 代替 lu 来打印 size_t。

寓意:sizeof 不是函数而是运算符。

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

数组名称不衰减的少数情况之一是它是 sizeof 运算符的主题。在这种情况下,sizeof 评估数组的大小(以字节为单位),在这种情况下为 40。

另一方面,

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

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