首页 > 解决方案 > 为什么 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()运算符返回 40arr和 8 arr2
为什么sizeof(arr)是 40,因为它只存储数组第一个元素的地址?

标签: arrayscmallocsizeof

解决方案


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

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

arr2另一方面是指向 an 的指针int,因此使用sizeofon 它会为您提供系统上为 8 的指针的大小。它是否指向动态分配的数组、本地数组的开头或在两者中间的某个地方。唯一sizeof要看的是它的操作数的类型。事实上,除非它的操作数是一个变长数组,否则是sizeof在编译时求值的。


推荐阅读