我新建了一个2 dim数组,但是数组的大小为0:
auto **p = new string*[7];
for (int i = 0; i < 7; ++i) {
p[i] = new string[4];
}
cout << sizeof(p) / sizeof(string)<< endl;
任何人都可以给我一个关于这个问题的专门答案:
答案 0 :(得分:2)
当您使用new
为数组分配内存时,它会尝试分配存储,并在成功时返回指向数组初始元素的指针。因为这里分配的数组衰减到一个指针,你丢失了有关数组大小的信息,以字节为单位,所以你不能计算元素的数量:
auto numberOfElements = sizeof(array) / sizeof(element);
在您的示例中,sizeof(p)
返回与基于您的体系结构的sizeof(std::string**)
相同的内容。 sizeof(string)
可能比sizeof(std::string**)
更大,因此从整数除法得到0
。
强烈建议在c++中使用Standard containers代替手动分配和取消分配。根据您提问的评论,std::vector
是您在示例中应该使用的内容,如下所示:
vector<vector<string>> p(7, vector<string>(4));
cout << p.size() << endl;
注意:为string*[7]
分配内存时,您已明确指定元素数量,即7
。
答案 1 :(得分:1)
sizeof(p)
是指针的大小,在系统中可能是8。
sizeof(string)
是类的大小,大于8。
结果你打印:
8 / greaterThan8
它给你0,因为它是一个整数除法。如果你把它投射到浮动状态,它就不会打印0。
答案 2 :(得分:0)
sizeof(string)大于sizeof(p)
对于这样的整数除法,结果将为0.
例如1/4不是0.25,它是0。