2015-11-22 3 views
-1

В моей main() функции я объявлен array типа int с номерами от 1 до 10. Я тогда две других функций типа int*, которые принимают этот массив и его размер в качестве параметров, выполнить некоторые операций, и каждый возвращает указатель на новый массив. У меня возникают проблемы с третьей функцией, которая печатает содержимое массива.Печать содержимого массива измененная в функции

#include <iostream> 

using namespace std; 

const int SIZE_OF_ARRAY = 10; 

int main() { 

    int array[SIZE_OF_ARRAY] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

    int *ptr1 = 0; 
    ptr1 = function1(array, SIZE_OF_ARRAY); 
    print(array, SIZE_OF_ARRAY); 

    cout << endl; 

    int *ptr2 = 0; 
    ptr2 = function2(array, SIZE_OF_ARRAY); 
    print(array, SIZE_OF_ARRAY); 

    return 0; 
} 

void print(int array[], const int SIZE_OF_ARRAY) 
{ 
    for (int i = 0; i < (SIZE_OF_ARRAY * 2); i++) 
    { 
     cout << array[i] << " "; 
    } 
} 

int* function1(int array[], const int SIZE_OF_ARRAY) 
{ 
    int *ptr = new int[SIZE_OF_ARRAY]; 

    // Do stuff. 

    return ptr; 
} 

int* function2(int array[], const int SIZE_OF_ARRAY) 
{ 
    int *ptr2 = new int[SIZE_OF_ARRAY * 2]; 

    // Create new array double in size, and set contents of ptr2 
    // to the contents of array. Then initialize the rest to 0. 

    return ptr2; 
} 

Как и следовало ожидать здесь, результат вызова функции print() дважды что-то вроде:

1 2 3 4 5 6 7 8 9 10 465738691 -989855001 1483324368 32767 -1944382035 32767 0 0 1 0 
1 2 3 4 5 6 7 8 9 10 465738691 -989855001 1483324368 32767 -1944382035 32767 0 0 1 0 

Но я хочу, чтобы результат, как это вместо:

1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 

Как может Я это делаю? (Обратите внимание, что для этого назначения я использую C++ 98). Заранее спасибо.

+0

Возврат 'новых''d отчислений от функций просто требует утечки памяти. Вы должны использовать векторы или постоянный размер, регулярные массивы. –

ответ

0

new int[SIZE_OF_ARRAY] выделяет память, но не присваивает значения элементам массива. То, что вы видите, это то, что было в этой памяти, когда оно было выделено для массива. Вы можете изменить свой function2, чтобы назначать нули в элементы массива, если это то, что вы хотите.

0

Прежде всего, вы хотите напечатать различное количество элементов на двух вызовов print, так что вы не должны делегировать решить, следует ли умножить размер на два с print, а сделать это на вызывающей стороне. Изменение функции print только итерацию до SIZE_OF_ARRAY и изменить два места, где вы называете его:

print(ptr1, SIZE_OF_ARRAY); 

и

print(ptr2, SIZE_OF_ARRAY * 2); 

соответственно.

Теперь я предполагаю, что ваша вторая функция присваивает значения всем 20 элементам, но если это не так, те, которым она не присваивает значения, будут продолжать содержать мусор. Чтобы обойти это, просто инициализировать их в начале второй функции:

int *ptr2 = new int[SIZE_OF_ARRAY * 2]; 
for (size_t i = 0; i < SIZE_OF_ARRAY * 2; ++ i) ptr2[i] = 0; 

С помощью этих двух изменений, которые вы должны получить желаемое поведение.

Кроме того, если вы выделили что-то с new[], вам необходимо удалить его с помощью delete[], иначе вы получите утечку памяти. Добавьте эти две строки в конце main:

delete[] ptr1; 
delete[] ptr2; 

Обратите внимание, что с помощью delete вместо delete[] было бы неправильно в этом случае. Если что-то выделяется как массив, то должно быть удалено в виде массива.

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