С++ Как получить длину массива указателей?

Мне трудно найти длину массива указателей. Скажем, у меня есть:

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, это хорошо, но я чувствую, что в некоторых ситуациях это может быть ошибкой.

Ответы

Ответ 1

Вы не можете, я боюсь. Вам нужно передать длину массива всем, кто в ней нуждается. Или вы можете использовать std::array или std::vector или подобные, которые сами отслеживают длину.

Ответ 2

С++ имеет правильный тип строки:

std::string

который вы можете найти здесь. Даже если вы передаете его функции, которая принимает const char*, у нее есть метод .c_str(), который позволяет передать его функции, принимающей указатель. Если другой функции необходимо изменить строку, вы можете использовать &str[0], которая действительна для многих реализаций С++ и должна работать для С++ 11. Просто убедитесь, что вы изменяете размер() до нужного размера.

Некоторые из других контейнеров в С++:

std::array (С++ 11) Массив постоянного размера. Лучше, чем простой старый массив C, поскольку он имеет метод size(). std::vector Динамический массив (эквивалент Java ArrayList)

Что касается вашего вопроса - нет способа найти размер заостренного массива. Как вы могли это сделать? Это просто глупый указатель.

Ответ 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;
}

Ответ 5

Если вы хотите сохранить простой и не использовать #include <array.h>, вы можете создать структуру, в которой вы имеете размеры массива. Немного нравится:

struct
{
    int* int_Array;
    int array_Size;
}

Таким образом, вы можете делать все, что захотите (например, удалять свои экземпляры или что-то еще)