1

我正在尝试使用双指针方法在 C++ 中创建一个二维数组。但是当我初始化变量时,我总是知道数组的大小是 8。起初我试过这个:

  double** sobel_x;

并得到大小为 8,然后当我尝试这个时:

  double** sobel_x;
  sobel_x = new int*[3];
  for(int i = 0; i < sizeof(sobel_x); i++) {
    sobel_x[i] = new int[3];
  }

有人可以先向我解释为什么数组初始化为 8 大小,然后如何更改该大小?

4

2 回答 2

4

这段代码:

double** sobel_x = new int*[3];
std::cout << sizeof(sobel_x);

将始终打印sizeof 指针,因为sizeof在编译时评估(基于类型,double**在这种情况下),无论您在运行时为此指针分配了什么。

改用std::vector

std::vector< std::vector<double> > sobel_x(3, std::vector<double>(3, 0.0));
std::cout << sobel_x.size();

请注意,即使您能够检索大小,大小也将以字节为单位。它不会给你元素的数量。要使用数组实现这一点,您可以使用具有自动存储持续时间的静态数组:

double sobel_x[3][3] = { 0.0 };
std::cout << sizeof(sobel_x);                         // <-- outputs 72
std::cout << sizeof(sobel_x[0]);                      // <-- outputs 24
std::cout << sizeof(sobel_x) / sizeof(sobel_x[0]);    // <-- outputs 3
于 2013-10-05T09:52:30.213 回答
1

您在 sobel_x 上调用 sizeof,而 sobel_x 是一个指针。这意味着 8 是系统上指针的大小(可能是 64 位机器)。

这篇文章解释说你不能做你想做的事:C++:获取传递给函数的多维数组的行大小

如果您需要在运行时计算长度,请使用 STL 类之一,如 vector。

尽管对于您的简单用例,您已经知道 sobel_x 指向的数组中有多少元素(在本例中为 3),因此只需将其用作循环中的测试条件。

于 2013-10-05T09:53:12.550 回答