2014-11-13 2 views
0

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

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

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

«Массив объявляется перед вызовом функции» - это означает, что массив задан и распределен. Поэтому непонятно, чего вы пытаетесь достичь. –

ответ

7

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

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

int *f() 
{ 
    size_t n = 10; 

    int *p = new int[n]; 

    return p; 
} 

И functionn называется как

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

Это почти то, что мне нужно. Я думаю, что я не очень хорошо объяснил свою проблему. Итак, у меня есть arrya int внутри моей основной функции. Затем мне нужно вызвать функцию A(), которая принимает в параметр пустой массив, эта функция будет вычислять размер, а затем выделять и заполнять массив. Впоследствии я могу использовать свой заполненный массив в своей основной функции –

+0

@kevin labille Как я писал в своем сообщении, вы не можете определить пустой массив. Вы можете определить указатель, а затем в функции выделить память для массива и назначить его адрес указателю, как я показал в своем сообщении. –

+0

Я попробовал первое и второе решение, но оно не сработало. Как передать массив моей функции, которая должна заполнить ее? Прямо сейчас я объявил массив в основном, затем передаю его функции, а затем я вызываю ваш второй метод для ее выделения, внутри этой функции –

Смежные вопросы