Как перебрать указатель на массив (int *), когда размер неизвестен? - PullRequest
0 голосов
/ 06 апреля 2019

Я просматривал некоторые проблемы с кодированием, и я столкнулся с проблемой, когда входной массив задан как "int *" вместо вектора.

Это заставило меня задуматься, как перебирать этот массив если бы мы не знали размер:

vector<int> cellCompete(int* states, int days) 
{
    // my try: 
    for (; *states; states++ ) {
        cout << *(states) << " ";
    }

    vector<int> testArray;
    return testArray;
}

Как вы можете видеть, я попробовал простой способ перебора массива, пытаясь проверить, будет ли указатель возвращать nullptr вточка.

Пример:

[1, 0, 0, 0, 0, 1, 0, 0] returned "1" as output
[1, 1, 1, 0, 1, 1, 1, 1] returned "1 1 1" as output.

Однако этот подход работал в следующем примере:

#include <iostream>
using namespace std;

int main () {
   // an array with 5 elements.
   double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
   double *p;

   p = balance;

    for (; *p; p++ ) {
        cout << *(p) << endl;
    }

   return 0;
}

Это вопрос https://www.geeksforgeeks.org/active-inactive-cells-k-days/, ноЯ не могу поделиться ссылкой, где я сталкивался с вопросом, потому что это конфиденциально.В версии, которую я должен был решить, функция ввода была "int *" вместо других опций.

Доп. Функции : На том же веб-сайте мой подход работал для другого вопроса с аналогичным вводом:

int generalizedGCD(int num, int* arr)
{
    // WRITE YOUR CODE HERE  
    for (; *arr; arr++ ) {
        cout << *(arr) << " ";
    }

    return 1;
}

где входные примеры были:

[2, 3, 4, 5, 7] и [2, 4, 6, 8, 10]

Есть ли более надежный способ перебирать указатель на массив , когда мы не знаем размер массива?

Ни один из источников, которые я обнаружил в Интернете, не дает путиитерировать , не зная размера.

Я хотел выразить, что этот вопрос действительно указывает размер массива, но он просто заставил меня задуматься, есть ли способ итерации без заданного размера.

1 Ответ

1 голос
/ 06 апреля 2019

Нет, нет.

Вам либо нужен какой-то завершающий символ, как в строках с нулевым символом в конце, либо явно указывается размер.

Кроме того, ваш подход делаетне работает и не безопасно.*state не скажет вам, если ваш указатель nullptr.operator* - разыменование и получение значения объекта, на который ссылается указатель.Вот почему вы останавливаете цикл, когда он достигает значения 0 в вашем массиве.Если у вас нет нулей в массиве, цикл будет продолжаться до тех пор, пока вы не выйдете из выделенного пространства для вашего массива, и у вас будет неадресуемый доступ, что приведет к неопределенному поведению, потому что вы будете получать доступ к памяти, которую можно использоватьдля чего-то другого или, что еще хуже, может быть доступным только для чтения или вне адресного пространства процесса, что приводит к сбою.

Чтобы принять фактическое значение указателя (адреса), вам нужно поставить галочку state вместо*state, но это не будет nullptr.Значение переменной state - это просто некоторое число (равное адресу памяти, в который записан массив), а ++state просто увеличивает это число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...