我正在尝试使用指针创建动态数组或者你应该调用什么,但是当我在设置元素后尝试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;
}
答案 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];
numbers
被明确定义为指向某个内存的指针,当你执行sizeof(numbers)
时,它会尝试评估指针的大小,这将是4或8个字节,具体取决于您所使用的编译器和平台。
同样,numbers
是一个指针,指向内存块中的第一个项目。没有简单的方法可以判断它所指向的计算机中的哪一块内存,以及该块的字节大小
这意味着您必须自己跟踪阵列的大小。
您已经拥有变量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”。