【问题标题】:Initializing C++ arrays with pointers, getting size 8用指针初始化 C++ 数组,大小为 8
【发布时间】:2013-10-05 09:49:54
【问题描述】:

我正在尝试使用双指针方法在 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 大小,然后如何更改该大小?

【问题讨论】:

  • new int --> new double ?
  • 如何查看尺寸?您可能会看到指针的大小,而不是数组的大小 - 您只存储一个指针就丢弃了它。
  • @P0W 谢谢!我什至没有注意到我这样做了

标签: c++ arrays pointers multidimensional-array sizeof


【解决方案1】:

这段代码:

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

【讨论】:

  • 有没有办法用数组做到这一点?
  • @azrosen92:现在检查我的答案 :)
  • 嗯好吧,我想这给我带来了我的第二个问题,我试图在我编写的另一个函数中使用这个数组,我设计了一个任意数组大小作为输入。而且我在 C++ 中发现不能声明函数void FunctionName(double[][] array),而必须使用void FunctionName(double** array)。那么有什么方法可以制作一个可以在FunctionName 中工作的数组吗?
【解决方案2】:

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

这个帖子说明你不能做你想做的事:C++: getting the row size of a multidimensional array passed to a function

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多