C++数组与指针混淆:两种初始化方式的sizeof结果差异疑问
栈数组与动态分配数组的
sizeof计算差异解析 本质原因:类型不同
- 栈上声明的
int a[10];中,a的类型是长度为10的int数组(int[10])。sizeof(a)计算的是整个数组的总字节数,也就是10 * sizeof(int),因此sizeof(a)/sizeof(int)的结果就是数组元素个数10,符合预期。 - 动态分配的
int* a = new int[10];中,a的类型是int指针(int*)。sizeof(a)得到的是指针变量本身的字节数(不同平台下可能是4或8,取决于系统位数)。如果你的环境中指针大小和int的字节数相等,比如都是4或者都是8,那sizeof(a)/sizeof(int)就会得到1。
关于“数组作为指针”的误区
数组名在多数表达式场景中会隐式转换为指向首元素的指针,但数组本身不是指针。只有在少数特殊场景(比如sizeof运算、&取地址运算)中,数组名会保留其数组类型,不会被转换为指针。
动态分配数组时,new int[10]返回的仅仅是指向数组首元素的指针,这个指针不携带任何数组长度的信息。所以无法通过指针本身计算出数组的元素个数,必须自己额外记录数组长度(比如用一个单独的变量存储10)。
内容的提问来源于stack exchange,提问作者Ajeet Kumar
相关产品推荐
相关产品推荐

