此问题在此处已有答案:
What does the new operator returns?(6个答案)
How to get size of dynamic array in C++ [duplicate](1个答案)
what is return type of new in c++?(2个答案)
2天前关闭。
我想看看动态创建的数组是否和普通数组有相同的行为,但看起来它们确实有一点不同。下面是我用来测试它们行为的代码:
int main(){
int *int_array{new int[10]};
cout<<sizeof(*int_array);
return 0;
}
显示到控制台的输出为:4
但是对于一个普通的整型数组,使用sizeof函数,我得到了数组所占的总字节数,如下面的代码所示:
int main(){
int int_array[5];
cout<<sizeof(int_array);
return 0;
}
显示到控制台的输出为:20个
因此,当我解引用一个指向动态分配数组的指针时,至少对于“sizeof”函数来说,我只能“看到”数组的第一个元素,而不是整个数组。
是这样吗?你能解释一下这里发生了什么吗?
我希望看到所有类型的数组都有统一的、一致的行为,不管它们是如何创建和存储在内存中的。我试着在谷歌上搜索Dyn.分配的数组和普通数组之间的区别,但他们没有给出任何解释。
2条答案
按热度按时间7gs2gvoe1#
在IDE的帮助下,您可以看到类型的差异。
第一个示例
这是
int[5]
类型,包括它的大小。它可以隐式转换为int*
sizeof(int*) == 8
将其指定给引用将保留
int&[5]
类型。sizeof(int&[5]) == 20
第二个示例
堆分配数组总是以
int*
作为返回类型。sizeof(int*) == 8
进一步阅读不同的数组类型
https://en.cppreference.com/w/cpp/language/array
nbewdwxp2#
出于纯粹的直觉,而不是测试这个,静态数组的大小(20)是5的倍数-a初始化数组时声明的记录,以及4 --来自第一个main()函数的 int_array的大小。
静态数组sizeof给出了静态声明的数组的总大小。动态int_array的内容sizeof是它所指向的数组头的大小。
这引起了我的兴趣,我想玩一玩,但我的感觉是,静态数组和动态数组的行为并没有什么不同,更大的区别在于sizeof如何解释它被赋予的内容,所以
int intArray[5];
不是一个指针,它是静态声明的,并使用程序的数据内存,它的维数是已知的,它是一个整型数组,因此它的大小是4字节(对于int) 5(元素的数目)。而
int *intArray{new int[10]};
是用new
示例化的,所以它是在堆上的,但它是一个指针,我们知道指针只指向内存的一个区域,所以sizeof只给出指针指向的块,我们知道它是动态创建的数组的第一个元素,它是一个整数,所以是4个字节。并运行,得到:
将
ARRAYSIZE
更改为10,正如您最初声明的那样,我们得到40。