You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态分配数组与常规数组的sizeof行为差异及原理咨询

动态数组与常规数组的sizeof行为差异疑问

我尝试验证动态创建数组与常规数组的行为是否一致,结果发现二者存在差异。

测试动态数组的代码:

int main(){
    int *int_array{new int[10]};
    cout<<sizeof(*int_array);
    return 0;
}

控制台输出为:4

测试常规数组的代码:

int main(){
    int int_array[5];
    cout<<sizeof(int_array);
    return 0;
}

控制台输出为:20

由此可见,解引用动态分配数组的指针时,sizeof仅能识别数组的首个元素而非整个数组。请问该结论是否正确?能否解释其中原理?我原本期望所有类型数组的行为一致,与创建和存储方式无关,且未在搜索结果中找到相关解释。


问题解答

你的结论是正确的,核心原因在于动态数组的指针和常规数组的类型本质不同:

  • 常规数组的类型特性
    声明int int_array[5];时,int_array的类型是int[5](长度为5的int数组类型)。sizeof在编译期就能确定这个类型的大小,直接计算5 * sizeof(int),所以得到20(假设int为4字节)。只有当数组名被用作函数参数等场景时,才会被隐式转换为指向数组首元素的指针(int*),此时sizeof才会计算指针或单个元素的大小。

  • 动态数组的本质
    new int[10]返回的是int*类型的指针,仅指向数组的第一个元素。你声明的int *int_array是普通指针变量,类型为int*,完全丢失了数组长度的信息。解引用它(*int_array)得到的是单个int类型元素,因此sizeof(*int_array)等价于sizeof(int),结果为4。

简言之,常规数组在编译期就携带了长度信息,而动态分配的数组仅返回首元素指针,编译器无法从该指针获取数组总长度,sizeof自然只能计算单个元素的大小。

内容的提问来源于stack exchange,提问作者davecodes_029

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:25:17