计算双指针数组的长度

Calculate length of double pointer array

本文关键字:数组 指针 计算      更新时间:2023-10-16

我有一个双指针 结构数组:

typedef struct Position{
    int x;
    int y;
} Position;
Position** array = (Position**)malloc(sizeof(Position*)*10); //10 elements
array[0] = (Position*)malloc(sizeof(Position*));
array[0]->x = 10;
array[0]->y = 5;

我可以计算集合数组的长度吗,如果是,如何计算?

数组的正常方式不起作用:

int length = sizeof(<array>)/sizeof(<array>[0]);

一旦你动态分配了一个数组,就无法找出其中的元素数量。

我曾经听说过一些获取内存块大小(msize(的黑客方法,据称它可以让你推断块内数据的大小,但我建议不要使用任何这种奇怪的技巧,因为它们不在标准范围内,它们代表编译器供应商特定的扩展。

因此,知道数组大小的唯一方法是保持数组的大小。 声明一个struct,将数组及其长度放在结构中,并使用它代替裸数组。

当您将问题标记为C++时,我建议您使用std::vector,然后,在您"分配了一些内存"(或请求一些内存由构造函数或使用push_backresize分配std::vector分配(之后,您可以使用std::vector::size简单地恢复大小。

typedef struct Position{
    int x;
    int y;
} Position;
std::vector<Position> array(10);
array[0].x = 10;
array[0].y = 5;
size_t size = array.size(); // will be 10

只有一个指向某个内存块的指针,您无法延迟此内存块的大小。因此,您不能延迟其中的元素数量。

但是,对于指针数组,您可以在以下条件下推断其中的元素数:

  1. 确保每个指针(最后一个指针除外(都指向有效对象。
  2. 对于数组中的最后一个指针,请确保它始终NULL

然后你可以通过计数来得出长度,直到你达到NULL

也许还有其他一些类似的策略。

但是,仅从指针本身,无法派生其中的元素数。

老问题,但万一有人需要它:

#include <stdio.h>
...
int main()
{
    char **double_pointer_char;
    ...
    int length_counter = 0;
    while(double_pointer_char[length_counter])
        length_counter++;
    ...
    return 0;
}