2013-03-14 3 views
0

В настоящее время я изучаю C++, так что извините, если мне кажется немного глупо.C++ Создание массива с помощью указателей

Мое текущее упражнение, в котором я застрял, требует от меня написать функцию IndexArray (int n), которая возвращает указатель на динамически распределенный целочисленный массив с n элементами, каждый из которых инициализируется собственным индексом , (скопирован с листа).

Я прочитал это несколько раз, и не в полной мере понимаю, но они дали пример:

Предполагая, что IntPtr объявлен как

int *intPtr; 

Заявление

intPtr = IndexArray(10); 

должен иметь следующую конфигурацию памяти:

intPtr -> 0 1 2 3 4 5 6 7 8 9 

В этом примере я предполагаю, что моей функции необходимо создать массив размером n, со значениями от 0 до n-1, а затем другой указатель должен указывать на этот массив.

Вот их тестовый код:

int *values1; 
values1 = IndexArray(10); 

Я знаю, как легко создать массив, но я не совсем понимаю, указатели достаточно, чтобы знать, на самом деле, что делать. Я понял, возвращая массив будет работать:

int *IndexArray(int n) { 
    cout << n << endl; 
    int arrayTemp[n]; 
    for(int i = 0; i < n; i++) { 
     arrayTemp[i] = i; 
    } 
    return arrayTemp; 
} 

Однако при тестировании, values1 массив не содержит значения из 0-9 (хотя arrayTemp делает правильно, прежде чем он вернулся).

Любая помощь будет потрясающей, и, надеюсь, я дал все, что вам нужно, чтобы помочь. Благодаря! : D

+0

int arrayTemp [n]; => int * arrayTemp = new int (n); Память Beacuse, выделенная для int arrayTemp [n], будет выпущена после возврата arrayTemp; – neohope

+0

Это не C++. C++ не поддерживает VLA (массивы переменной длины). Тег изменен на C –

+0

Это C++, и это не массивы переменной длины. Длина массива никогда не изменяется. Длина передается функции, а размер массива создается из отправленной длины. После этого он никогда не меняется. –

ответ

3
int arrayTemp[n]; 

Обратите внимание, что утверждение в функции, поэтому, когда функция завершается, arrayTemp [] не будет доступно больше, она coule быть удалены: это # ​​локальная переменная #!

Итак, если вы хотите сделать это, вы могли бы использовать:

int * arrayTemp = new int[n]; 

УВЕДОМЛЕНИЕ: вы должны удалить любые, как избежать утечек памяти.

2

Вы не можете сделать это:

int *IndexArray(int n) { 
    cout << n << endl; 
    int arrayTemp[n]; //declare a local array 
    for(int i = 0; i < n; i++) { 
     arrayTemp[i] = i; 
    } 
    return arrayTemp; //return a pointer to a local 
} 

Вы не можете вернуть указатель на локальный. Местный перестает существовать, как только вы вернетесь. Указатель теперь указывает на мусор.

Вместо этого, вы должны использовать malloc (C или C++) или new (C++) для динамического создания хранилища для 10 Интса, и так как это создается динамически в куче будет сохраняться после возвращения (и должно быть free d, если malloc ed или delete[] d, если это массив, сделанный с помощью new.Для простых объектов, сделанных с помощью new, вы просто используете delete)

+0

Я бы добавил, что вы также можете передать указатель на' n' 'int' и заполнить его в функции –

+0

@Ed S. 'IndexArray (int n), который возвращает указатель на динамически выделенный целочисленный массив. Если он заполняет массив, переданный ему, он не выполняет динамическое распределение. – Patashu

+0

Да ... Я это понимаю. Проблема в том, что вы сказали, что у вас есть *, чтобы использовать динамическое распределение, что неверно, и, честно говоря, это плохая идея для начала. По крайней мере, верните умный указатель. Другой вариант - взять массив в качестве аргумента и ничего не возвращать. –

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