arrays - 为什么 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,因为它只存储数组第一个元素的地址?
解决方案
arr
不包含数组第一个元素的地址。 arr
是数组。在大多数情况下,它只是衰减到指向第一个元素的指针。
数组名称不衰减的少数情况之一是它是sizeof
运算符的主题。在这种情况下,sizeof
以字节为单位计算数组的大小,在这种情况下为 40。
arr2
另一方面是指向 an 的指针int
,因此使用sizeof
on 它会为您提供系统上为 8 的指针的大小。它是否指向动态分配的数组、本地数组的开头或在两者中间的某个地方。唯一sizeof
要看的是它的操作数的类型。事实上,除非它的操作数是一个变长数组,否则是sizeof
在编译时求值的。
推荐阅读
- .net - 如何在 Azure AD B2C 登录的 webview 屏幕中删除 URL
- tabs - 如何将 konsole 选项卡放在左侧?
- ssl - 在非阻塞模式下,openssl 允许在客户端使用任何证书
- reactjs - Jest,Enzyme,React - 测试 Iframe OnLoad
- javascript - 从 Dropzone.js 获取全尺寸图像(不是缩略图大小)的数据 URI
- c++ - c++ Boost if .extension() == "" 这意味着这个文件是一个文件夹?
- google-apps-script - 检查单元格中的值并将其与单个单元格进行比较
- sas - SAS 中的宽到长数据集
- android - 从 Gradle 获取 PullRequest 编号
- sql-server - SQL Server:批处理中的语句都作为一个事务执行?