c++ 动态创建的数组和常规数组的行为差异[duplicate]

osh3o9ms  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(107)

此问题在此处已有答案

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.分配的数组和普通数组之间的区别,但他们没有给出任何解释。

7gs2gvoe

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

nbewdwxp

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个字节。

  • 编辑:* 继续我的沉思...获取整个动态数组的大小,为了模拟sizeof静态数组的情况,我们可以将所有元素加在一起,并期望看到相同的答案加倍(因为您将动态数组声明为10,而不是静态数组的5)
#include <iostream>

#define ARRAYSIZE 5
using namespace std;

int main()
{
    int *int_array{ new int[5] };
    cout << "Saying:\n";
    cout<<sizeof(*int_array);
    cout << "\nIs the same as saying:\n";
    cout<<sizeof(int_array[0]);
    cout<<"\n";
    cout << "Mimic sizeof(static_array), we need to:\n";
    int size = 0;
    int i = 0;
    for (i = 0; i < ARRAYSIZE - 1; i++) {
        size+=sizeof(int_array[i]);
        cout<<sizeof(int_array[i]);
        cout<<" + ";
    }
    cout << sizeof(int_array[i+1]);
    cout << " = ";
    cout<<(size+=sizeof(int_array[i+1]));
    cout << "\nwhich is the same size as the static sizeof!\n";

    return 0;
}

并运行,得到:

noscere@bertram:~/src/Stack/dynamicArrays$ g++ dynArray.cpp -o dynArray
    noscere@bertram:~/src/Stack/dynamicArrays$ ./dynArray 
    Saying:
    4
    Is the same as saying:
    4
    Mimic sizeof(static_array), we need to:
    4 + 4 + 4 + 4 + 4 = 20
    which gives us the same size as the static sizeof!

ARRAYSIZE更改为10,正如您最初声明的那样,我们得到40。

相关问题