#c #pointers
Вопрос:
Я пробовал как индексирование, так и указатели там в основном, но все равно те же результаты. Как я могу это исправить?
# include lt;conio.hgt; # include lt;iostreamgt; using namespace std; int * add5ToEveryElement(int arr[], int size) { int theArray[5]; for(int i=0; ilt;size; i ) { theArray[i] = arr[i] 5; coutlt;lt;theArray[i]lt;lt;endl; } return theArray; } void main() { const int size = 5; int noArr[size]; for(int i=0; ilt;size; i ) { noArr[i] = i; } int *arr = add5ToEveryElement(noArr, size); coutlt;lt;endl;coutlt;lt;endl; for(int i=0; ilt;size; i ) { coutlt;lt;arr[i]lt;lt;endl; } coutlt;lt;endl;coutlt;lt;endl;coutlt;lt;endl;coutlt;lt;endl; for(int i=0; ilt;size; i ) { coutlt;lt;*arrlt;lt;endl; *arr ; } getch(); }
Комментарии:
1. @Mat o нет, сэр, это не дубликат, это проблема, с которой я сталкиваюсь, и поиск не помог мне
2. Это та же самая проблема. Вы возвращаете указатель на автоматический (основанный на стеке) массив.
3. ну, этот парень не использует индексы, как я, моя обновленная версия, а не дубликат 😛
4. @Asadullah Есть ли причина, по которой вы не используете
std::vector
вместо массивов?5. @jogojapan нет, сэр, нет причин, но я учу кого-то, как работают массивы и как они передаются в функцию и возвращаются из функции 🙂
Ответ №1:
theArray
является локальным массивом в функции add5ToEveryElement()
, которую вы возвращаете в main(). Это неопределенное поведение.
Как минимум, вы можете изменить эту строку:
int theArray[5];
Для:
int *theArray = new int[5];
Это будет хорошо работать. Не забудьте об delete
этом позже в main(). Поскольку вы изменили исходный указатель, сохраните его:
int *arr = add5ToEveryElement(noArr, size); int *org = arr; // Rest of the code //Finally delete[] org;
Комментарии:
1. int *theArray = новый int[5]; Это не делает его локальным ??
2. @Асадулла Нет. Это массив, выделенный в куче, который будет активен до
delete
тех пор, пока не будет явно. Вот почему я обновил, чтобы освободить память в основном.3. вы абсолютно правы. теперь об утечке памяти ?? что мне делать ??
4. я должен написать delete theArray в конце main ?? или что ??
5. спасибо всем вам за вашу помощь. и последнее, как утечка памяти повреждает мою систему или что произойдет, если утечка памяти ??
Ответ №2:
Возврат массива из функции обычно считается плохим.
Если вам НЕ нужен «новый» массив, я бы предложил, чтобы типичным случаем в C и C было изменение входного массива. Если ВЫЗЫВАЮЩАЯ функция хочет иметь два отдельных массива, она может сделать это, создав свою собственную копию. В качестве альтернативы вы можете написать свой код, чтобы в вашу функцию были переданы два массива, например
void add5ToEveryElement(int arr[], int arr2[], int size) { for(int i=0; ilt;size; i ) { arr2[i] = arr[i] 5; coutlt;lt;theArray[i]lt;lt;endl; } }
затем ваш main вызовет два аргумента массива, и если вы хотите использовать то же самое, что и для ввода и вывода, он тоже это сделает.
Конечно, это не совсем ответ на ваш вопрос, но он дает «лучшее» решение вашей проблемы.
Мне вообще не нравится распределение в функциях — особенно «скрытое» распределение (эта функция говорит, что она добавляет 5 к каждому элементу, а не «выделяет массив с добавлением 5 к каждому элементу». Код никогда не должен делать неожиданных вещей, и выделение памяти немного удивляет, если вы только попросили добавить 5 к каждому элементу)
Ответ №3:
это идеальный код
# include lt;conio.hgt; # include lt;iostreamgt; using namespace std; int * add5ToEveryElement(int arr[], int size) { int *theArray = new int[5]; for(int i=0; ilt;size; i ) { theArray[i] = arr[i] 5; coutlt;lt;theArray[i]lt;lt;endl; } return theArray; } void main() { const int size = 5; int noArr[size]; for(int i=0; ilt;size; i ) { noArr[i] = i; } int *arr = add5ToEveryElement(noArr, size); int *p = arr; coutlt;lt;endl;coutlt;lt;endl; for(int i=0; ilt;size; i ) { coutlt;lt;arr[i]lt;lt;endl; } coutlt;lt;endl;coutlt;lt;endl;coutlt;lt;endl;coutlt;lt;endl; for(int i=0; ilt;size; i ) { coutlt;lt;*arrlt;lt;endl; *arr ; } getch(); delete[] p; }