Используйте оператор new для выделения массива целых чисел, используя параметр в качестве размера массива в функции - PullRequest
0 голосов
/ 18 января 2019

Я застрял в этой проблеме, и я надеюсь, что кто-то может объяснить, где я ошибаюсь в этом. Я работаю над заданием, где мне нужно:

1) Выделите массив, который может содержать 100 значений int, путем вызова allocIntArray и назначьте возвращенный указатель на ptr1.

2) Используйте оператор new для выделения массива целых чисел, используя параметр в качестве размера массива.

3) Вернуть указатель, возвращаемый новым оператором.

4) Распечатать новый массив.

Я пытаюсь распечатать массив после передачи нужного мне размера через функцию.

int main() {
int *ptr = NULL;
ptr1 = *allocIntArray(100);
cout << ptr1 << endl;
return 0;
}

// Функция, которую я хочу вызвать

int *allocIntArray(int size) {
int *newarr = nullptr;

newarr = new int[size];

return newarr;
}   

Однако, когда я вызываю функцию, вывод выходит как 00F011E8. В настоящее время я пытаюсь понять, почему это вывод, а не первое значение в массиве. (Только номер 1)

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

Спасибо всем, кто нашел время, чтобы ответить. Из того, что я понимаю по направлениям назначения, мне не нужно использовать векторы. Я пытаюсь изменить свой текущий код для отображения выходных данных массива, и это то, что в настоящее время появляется, когда я его запускаю. [Введите описание изображения здесь Мои текущие результаты

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Я просто должен ответить, поскольку вы, похоже, упускаете некоторые важные основы. Либо инструктор должен быть уволен, либо вы не уделяли достаточного внимания в классе. Итак ...

ptr1 = *allocIntArray(100);

Вы не могли вставить вставленный код, ptr1 не объявлен. Вы должны понимать, что делает оператор *. Любое значение справа от * должно быть pointer. Что такое указатель, должно быть основополагающим в вашем понимании. Если у вас было:

int* ptr1 = *allocIntArray(100);

Вы должны были получить ошибку компилятора, поэтому вы должны иметь:

int ptr1;

Где-то вдоль линии. Поскольку allocIntArray(...) возвращает указатель, то *allocIntArray(...) дает вам целое число.

Вы бы хотели:

int* ptr1 = allocIntArray(100);

Чтобы получить указатель на новый массив. Тогда вы:

std::cout << ptr1 << std::endl;

Итак, что такое ptr1? Если это указатель, то все, что вы делаете, это печатаете значение указателя. В соответствии с вашей заявленной проблемой я бы сказал, что ptr1 на самом деле является указателем. std::cout не имеет возможности работать с указателем, как вы ожидаете. При этом он не сможет определить размер вашего массива. Вы бы хотели (и мне больно писать так):

for(size_t i= 0; i < 100; ++i)
    std::cout << ptr1[i] <<" ";

Но !!!

4) Распечатать новый массив.

Так что это будет печатать? Там никогда не было инструкции для инициализации массива. Он будет распечатывать то, что мусор когда-либо сидел в массиве, когда он был создан.

Заметьте, что инструктор заставляет вас делать:

using namespace std;

Много говорит, так как он / она никогда не должен был этого допустить.

0 голосов
/ 18 января 2019

Сначала, если вы используете C ++, вы должны использовать std :: vector / std :: array. Это позволяет избежать огромного количества возможных проблем.

Это будет выглядеть так:

#include <iostream>
#include <vector>

int main()
{
    // create array of size 10 and initialize it with 0's
    std::vector<int> vec(10, 0);

    // print array
    for(auto a : vec)
        std::cout << a << '\t';
    std::cout << std::endl;
}

Если это какое-то упражнение, вы сделали четыре большие ошибки:

  1. вы разыменовываете возвращенный указатель на массив. Таким образом, вы получаете значение первого элемента в массиве, а не сам массив. Просто удалите *.

  2. вы распечатываете адрес первого элемента массива. Чтобы распечатать массив, вы должны выполнить итерацию по каждому элементу массива. Это можно сделать в цикле for:

for(int i = 0; i < 10; ++i) std::cout << ptr1[i] << '\t';

  1. вы хотите распечатать массив без инициализации. На самом деле, вы пытаетесь распечатать некоторые случайные значения, которые есть в памяти. Сначала вам нужно присвоить значения элементов.

  2. вы забыли удалить массив с помощью удалить [] ptr1;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...