C ++ 2 dim array new得到0?

时间:2017-09-06 08:19:38

标签: c++ arrays

我新建了一个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;

任何人都可以给我一个关于这个问题的专门答案:

  1. 为什么结果输出为0,但sizeof(p)的结果为8,如果分母和分子不为零,结果如何为0? (如果分母为0则不是数学。)
  2. 如何实现新的2 dim数组正确包含字符串?

3 个答案:

答案 0 :(得分:2)

当您使用new为数组分配内存时,它会尝试分配存储,并在成功时返回指向数组初始元素的指针。因为这里分配的数组衰减到一个指针,你丢失了有关数组大小的信息,以字节为单位,所以你不能计算元素的数量:

auto numberOfElements = sizeof(array) / sizeof(element);

在您的示例中,sizeof(p)返回与基于您的体系结构的sizeof(std::string**)相同的内容。 sizeof(string)可能比sizeof(std::string**)更大,因此从整数除法得到0

强烈建议在中使用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。