【问题标题】:Why does sizeof() operator return different output for static and dynamic array? [duplicate]为什么 sizeof() 运算符为静态和动态数组返回不同的输出? [复制]
【发布时间】:2021-01-21 23:45:56
【问题描述】:

请看以下代码:

#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,因为它只是存储数组的第一个元素的地址?

【问题讨论】:

  • sizeof (a_pointer) 有多大?
  • 因为sizeof(int[10])sizeof(int*) 不同。
  • @DavidC.Rankin sizeof(pointer) 是 8
  • 什么是sizeof (arr2)? ——长得一模一样? (他们是,这就是为什么......)
  • arr2 是一个指针,而不是一个动态数组。 arr 不“包含数组中第一个元素的地址”,也没有“存储数组第一个元素的地址”。 arr 是一个数组。

标签: arrays c malloc sizeof


【解决方案1】:

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

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

另一方面,arr2 是指向int 的指针,因此在其上使用sizeof 可以得到系统上的指针大小为8。它是否指向a 无关紧要动态分配的数组,本地数组的开头,或两者中间的某个地方。 sizeof 唯一关注的是其操作数的类型。事实上,除非它的操作数是一个变长数组,否则sizeof 会被计算为编译时间。

【讨论】:

  • 如果我给 int arr[10]={1,2,3,4,5,6,7,8,9,0};并打印*arr,它打印1。所以arr包含数组第一个元素的地址
  • @KrishnaKanthYenumula 对于任何数组或指针arr 和索引i,表达式arr[i] 完全等于*(arr + i)。由此可见*arrarr[0] 相同。你不能用它作为数组是指针的证据。
  • @KrishnaKanthYenumula 不是。数组和指针不是一回事。
  • @KrishnaKanthYenumula 另见Is an array name a pointer?
  • @KrishnaKanthYenumula 请记住,sizeof 运算符的计算结果是其操作数的 type 的大小。 arr 的类型是 int[10]arr2 的类型是 int*。这两种类型有不同的大小,这就是 sizeof 的计算结果。
【解决方案2】:

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

Nit:用 zu 代替 lu 来打印 size_t。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多