【问题标题】:How do I get the width/height of a 2d array being pointed to with my pointer?如何获取指针指向的二维数组的宽度/高度?
【发布时间】:2011-10-11 12:42:55
【问题描述】:

如果我有这个引用变量:

float* image

如何在 C 中获取此图像的长度? length = (width * height) 但我怎样才能得到这个值?

【问题讨论】:

  • 那么如何确定它的长度,没有办法?
  • @devn:你必须把长度和指针保持在一起。
  • 不,我不知道,我只是通过调用来获得参考:analyze(float *image)
  • 我的家庭地址是 167,我的街道有多长?这几乎就是你要问的。该分析功能来自哪个库?我们将能够帮助您了解这一点。
  • 那么写analyse 的人正在为你存储幕后的长度(?)

标签: c arrays pointers multidimensional-array


【解决方案1】:
float * image

只需指向一个浮点数。它也可以与数组语法一起使用——即image[n] 从图像的位置获取第n 个浮点数。人们将使用指针和 malloc 来创建浮点数的动态数组。但是,没有与数据本身存储的大小相关的信息。这是编码人员在 C 中必须关心的一个细节。通常在 C 中的这种情况下,当您在函数中传递这样一个指针时,您还会传递一个伴随的大小,即:

void Foo(float* image, size_t numFloatsInImage)

听起来image 可能指向一个被视为二维数组的连续内存块。那是有宽度和高度的东西。因此,您可能会有类似“3x3”图像的东西,而不是严格的 numberOfFloats:

图像-> 0 1 2 3 4 5 6 7 8 0 0 0 1 1 1 2 2 2

这里总共有 3x3 == 9 个浮点数,前 3 个对应第 1 行,后 3 个对应第 2 行,最后一个对应第 4 行。这只是一个用于表示 2d 数据的一维数组。

就像我之前所说的,这是您决定如何使用该语言的细节,而不是它的一部分。您必须使用指针传递宽度/高度以安全使用:

void Foo(float* image, size_t width, size_t height)

您也可以通过简单地创建一个结构来存储您的图像来避免这种情况,确保始终正确初始化/维护宽度和高度

 struct
 {
     float* image; // points to image data
     size_t width;
     size_t height;
 };

然后总是将结构传递给像 foo 这样的函数

另一个技巧可能是过度分配浮点数以将宽度和高度存储在缓冲区本身中:

 float* image = malloc(width*height + 2);
 image[0] = width;
 image[1] = height;
 // everything past image[2] is image data

在任何情况下,都有这些和许多其他特定于实现的方法来存储/传递这些数据。给你这个指针的人应该告诉你如何获得长度/高度并告诉你如何使用指针。 C 无法弄清楚它是如何完成的,它是一个实现决策。

【讨论】:

    【解决方案2】:

    除非image 指向一些描述图像尺寸的数据结构,否则您通常无法以可预测且安全的方式找到尺寸。如果您尝试,您很可能会损坏和/或使程序崩溃。如果image 指向原始像素数据,则必须从获取数据的任何位置获取大小以及此指针。

    【讨论】:

      【解决方案3】:

      一个普通的指针本身不会告诉你它指向的缓冲区的大小。除非第一个元素以某种方式编码了缓冲区的大小,或者末尾有一个标记值(类似于字符串的实现方式),否则该信息必须单独提供。

      【讨论】:

        【解决方案4】:

        你不能,如果你只有一个指向 float 的指针,那么没有任何东西可以告诉你图像的大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-09
          • 1970-01-01
          • 2013-07-31
          • 2012-01-26
          相关资源
          最近更新 更多