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

时间:2015-06-30 19:45:26

标签: c++ arrays

我正在尝试使用指针创建动态数组或者你应该调用什么,但是当我在设置元素后尝试cout数组的长度时,它给了我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;
}

4 个答案:

答案 0 :(得分:2)

更好地使用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;
}

答案 1 :(得分:0)

你只是拿指针的大小。

但只需使用std :: vector

答案 2 :(得分:0)

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

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

int numbers[40];

编译器能够确定名为numbers的内存块大小为40个项目*每个8个字节= 320个字节,并确定sizeof(numbers)之类的语句等效于320 ,并进行适当的替换。

但是当你有像

这样的东西时
int *numbers = new int[n];
  1. numbers被明确定义为指向某个内存的指针,当你执行sizeof(numbers)时,它会尝试评估指针的大小,这将是4或8个字节,具体取决于您所使用的编译器和平台。

  2. 同样,numbers是一个指针,指向内存块中的第一个项目。没有简单的方法可以判断它所指向的计算机中的哪一块内存,以及该块的字节大小

  3. 这意味着您必须自己跟踪阵列的大小。

    您已经拥有变量kek,因此字节大小应为kek * sizeof(int)

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

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

答案 3 :(得分:0)

无法根据new[]返回的指针确定C ++中new[] ed数组的长度。所以,你“尝试长度”的尝试并没有真正做到这一点。 sizeof不会这样做,也无法帮助您。

“cout”new[] ed数组大小的唯一方法是记住这个大小,从你分配的位置手动携带数组到你需要“cout”大小的点。如果你在某种程度上失去了那个尺寸的知识,你就永远无法恢复它。

在您的情况下,大小为kek。这就是你的“cout”。