【问题标题】:How to get the length of an array from a pointer? [duplicate]如何从指针中获取数组的长度? [复制]
【发布时间】:2013-03-24 08:42:11
【问题描述】:

我无法找到指针数组的长度。假设我有:

char array[40] = "hello"; // size 40
int length =  sizeof array / sizeof array[0]; // no problem returns 40

//如何仅通过指向该数组中第一个元素的指针来获取数组的长度?

 char* pchar = array;

//如果

std::strlen(pchar); // this returns the length of 5... i want length 40

//如果

int count = 0;
while(true)
{
  if(*(pchar + count) == '\0') // returns 5...
    break;
   count++;
}

如何让它仅从指向数组中第一个元素的指针返回长度 40?
我发现我可以做到这一点。

int count = 0;
    while(true)
    {
      if(*(pchar + count) == '\0' && *(pchar + count + 1) != '\0') 
             break;

       count++;
    }

这返回 39,这很好,但我觉得在某些情况下这可能是错误的。

【问题讨论】:

  • 无法从指针中获取数组的长度。
  • 有一些技巧,但没有内置的方法可以做到这一点。

标签: c++ arrays pointers


【解决方案1】:

恐怕你不能。您需要将数组的长度传递给需要它的任何人。或者您可以使用 std::arraystd::vector 或类似名称,它们会自行跟踪长度。

【讨论】:

  • 嗯,但我最后一段代码返回 39,+1 = 40。为什么这样不好?
  • @JavaNewb:您正在将数组的末尾读取到未定义的内存中,这可能会导致崩溃。
【解决方案2】:

C++ 有正确的字符串类型:

std::string

您可能会在此处找到帮助。即使您将它传递给接受const char* 的函数,它也有.c_str() 方法允许您将它传递给接受指针的函数。如果其他函数需要修改字符串,可以使用&str[0],它对许多 C++ 实现有效,并且需要在 C++11 中工作。只需确保将它们 resize() 到正确的大小即可。

C++ 中的其他一些容器是:

std::array (C++11) 固定大小的数组。比普通的旧 C 数组更好,因为它有 size() 方法。 std::vector 动态数组(Java ArrayList 等效)

至于您的问题 - 没有办法找到指向数组的大小。你怎么能那样做?这只是一个愚蠢的指针。

【讨论】:

  • 即使你将它传递给接受 char* 的函数,它也有 .c_str() 方法允许你将它传递给接受指针的函数。 = => 这是不正确的。 c_str() 成员函数返回 const char *
  • @HappyGreenKidNaps 你是对的。这是我的疏忽。
【解决方案3】:

你不能。道德是,不要使用指针和数组,使用向量。你总是可以得到向量的大小。

【讨论】:

    【解决方案4】:

    确实不能从指向数组元素的指针中获取数组大小。

    如果您只有一个指针的原因是因为您正在实现一个将数组参数作为参数的函数,如下所示:

    void foo (T *p) {
        // p is a pointer to T
    }
    

    那么您可以使用模板函数来获取函数的数组大小。

    template <unsigned N, typename T>
    void foo (T (&p)[N]) {
        // p is a reference to an array[N] of T
        std::cout << "array has " << N << " elements" << std::endl;
        std::cout << "array has "
                  << sizeof(p)/sizeof(p[0])
                  << " elements"
                  << std::endl;
    }
    
    int main ()
    {
        int array[40];
        char array2[25];
        foo(array);
        foo(array2);
        return 0;
    }
    

    【讨论】:

    • +1,是的,所以完整的答案是:您无法从指向数组的指针中获取数组大小,但如果它是一个选项,而不是将指向数组的指针传递给您的函数可以传递对数组的引用,然后您可以使用此答案中的代码获取大小
    【解决方案5】:

    如果您想保持简单而不使用#include &lt;array.h&gt;,您可以在数组大小所在的位置创建一个结构。有点像:

    struct
    {
        int* int_Array;
        int array_Size;
    }
    

    这样,你就可以随心所欲(比如删除你的实例之类的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      相关资源
      最近更新 更多