C ++ Выделить динамический массив внутри функции

0

поэтому мне нужно выделить массив int внутри функции. Массив объявляется перед вызовом функции (мне нужно использовать этот массив вне функции), и размер определяется внутри функции. Является ли это возможным? Я много чего пытался, но пока ничего не работало.

Спасибо за помощь ребята ! Вот какой код:

void fillArray(int *array)
{
  int size = ...//calculate size here
  allocate(array, size);
  //....
}

void alloc(int * &p, int size)
{
  p = new int[size];
}

int main()
{
  //do stuff here
  int *array = NULL;
  fillArray(array);
  // do stuff with the filled array
 }
  • 1
    «Массив объявляется перед вызовом функции» - это означает, что массив определен и выделен. Так что не ясно, чего вы пытаетесь достичь.
Теги:

1 ответ

7
Лучший ответ

Если я правильно понял, вы не объявляли массив перед вызовом функции. Кажется, что вы указали указатель на int вместо массива. В противном случае, если вы действительно объявили массив, вы не можете изменить его размер и выделить память в функции.

Для выполнения этой задачи существует по крайней мере три подхода. Первый выглядит

int *f()
{
    size_t n = 10;

    int *p = new int[n];

    return p;
}

И функция n называется

int *p = f();

Другой подход заключается в объявлении параметра функции как типа указателя на указатель на int. Например

voif f( int **p )
{
    size_t n = 10;

    *p = new int[n];
}

и функцию можно вызвать как

int *p = NULL;

f( &p );

Третий подход - использовать ссылку на указатель как параметр функции. Например

voif f( int * &p )
{
    size_t n = 10;

    p = new int[n];
}

и функция называется подобной

int *p = NULL;

f( p );

Лучше всего использовать стандартный класс std::vector<int> вместо указателя. Например

void f( std::vector<int> &v )
{
   size_t n = 10;

   v.resize( n );
}

и функцию можно вызвать как

std::vector<int> v;

f( v );

Также вы можете использовать интеллектуальный указатель, такой как std::unique_ptr

  • 0
    Это почти то, что мне нужно. Я думаю, что я не очень хорошо объяснил свою проблему. Итак, у меня есть арта int внутри моей основной функции. Затем мне нужно вызвать функцию A (), которая принимает параметр в этот пустой массив, эта функция вычислит размер и затем выделит и заполнит массив. После этого я могу использовать мой заполненный массив в моей основной функции
  • 0
    @kevin labille Как я уже писал в своем посте, вы не можете определить пустой массив. Вы можете определить указатель, а затем в функции выделить память для массива и назначить его адрес указателю, как я показал в моем посте.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню