为什么 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 当前平台上类型的大小
请看下面代码:
#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 当前平台上类型的大小