C++:使用动态内存创建一个动态数组

C++: creating a dynamic array using dynamic memory

本文关键字:动态 数组 一个 创建 内存 C++      更新时间:2023-10-16

我正试图创建一个动态数组,或者你应该用指针来调用它,但当我在设置元素后尝试定制数组的长度时,它给了我0。我不确定我在这里做错了什么。

这是代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int *p = NULL;
    int kek = 0;
    cin >> kek;
    p = new int[kek];
    for (int i = 0; i < kek; i++) 
    {
        p[i] = 0;
    }
    int sizeOfArray = sizeof(p) / 8;
    cout << sizeOfArray << endl;
    delete[] p;
}

最好使用stl向量,这有size()方法

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> p;
    int kek = 0;
    cin >> kek;
    p.resize(kek);    
    for (int i = 0; i < kek; i++) 
    {
        p[i] = 0;
    }
    int sizeOfArray = p.size();
    cout << sizeOfArray << endl;
    p.clear();
    return 0;
}

您只需要获取指针的大小。

但只需使用std::vector

不能使用sizeof()来确定动态分配数组的大小,因为在编译时无法确定大小,因此不会存储在任何位置。

当你有一个静态分配的数组时,比如:

int numbers[40];

编译器能够计算出称为numbers的内存块的大小是40项*8个字节每个=320个字节,并确定像sizeof(numbers)这样的语句等价于320,并进行适当的替换。

但当你有类似的东西时

int *numbers = new int[n];
  1. numbers被明确定义为指向某些内存的指针,当你执行sizeof(numbers)时,它会尝试评估指针的大小,根据你所在的编译器和平台,指针的大小将是4或8个字节

  2. 同样,numbers是一个指针,指向内存块中的第一个项目。没有简单的方法来判断它指向计算机中的哪一个内存块,以及这个块有多大(以字节为单位)

这意味着您必须自己跟踪数组的大小。

您已经有了变量kek,所以以字节为单位的大小应该是kek * sizeof(int)

或者像其他人说的那样,你也可以使用向量来跟踪长度:

vector<int> numbers;
int sizeInBytes = numbers.size() * sizeof(int);

无法根据new[]返回的指针来确定C++中new[]ed数组的长度。所以,你试图"定制长度"并不能真正做到这一点。sizeof不会这么做,也不会帮你。

"定制"new[] ed数组大小的唯一方法是记住该大小,然后手动将其从分配数组的点携带到需要"定制"大小的点。如果你在这个过程中不知何故失去了对这个大小的了解,你将永远无法恢复它

在您的情况下,尺寸为kek。这就是你所说的。