Вопрос C ++, включая указатель, массив и функцию - PullRequest
3 голосов
/ 08 мая 2020

Итак, у меня здесь две программы,

первая использует динамическое c распределение, а вторая - массив фиксированного размера.

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

Однако при использовании массива фиксированного размера (вторая программа) программа работает без ошибок, НО выходы не такие, как я хотел.

Программы почти такие же, за исключением того, как создаются массивы ... но все же оба массива одинаковы, так что выходы не должны быть одинаковыми? В чем причины ?? Помогите, пожалуйста, разобраться ..

First Program Example:
input1      output1
    1            1
    2            2
    3            3
    4            4
    5            5

Second Program Example:
input1      output1
    1            1
    2            5
    3   2058618480
    4        32766
    5            5
// Using Dynamic Allocation
#include <iostream>

int *readNumbers(int n) { 
    int *a ;
    a = new int[n];

    for (int i=0; i<n; i++) {
        std::cout << "enter for a["<<i<<"]: ";
        std::cin >> a[i];
    }

    int *ptr;
    ptr= &a[0];

return ptr;
}


void printNumbers(int *numbers,int length){

    for (int i=0; i<length; i++) {    
    std::cout  << *(numbers+i) << "\n";
    }
} 


int main(){
    int n;
    std::cout << "enter for n: " ;
    std::cin >> n;  

    int *ptr; 
    ptr = readNumbers(n);
    printNumbers(ptr,n);

    delete [] ptr;    
    ptr = NULL;
return 0;
}

И еще

// Using fixed size array
#include <iostream>

int *readNumbers(int n) { 
    int a[5]={};    

    for (int i=0; i<5; i++) {
        std::cout << "enter for a["<<i<<"]: ";
        std::cin >> a[i];
    }

    int *ptr;
    ptr = &a[0];
return ptr;
}


void printNumbers(int *numbers,int length){

    for (int i=0; i<length; i++) {    
    std::cout << *(numbers+i) << "\n";
    }
} 


int main(){
    int *ptr; 
    ptr = readNumbers(5);
    printNumbers(ptr,5);
return 0;
}

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Я чувствую, что в первом случае, когда вы вызываете оператор new для выделения памяти для хранения нескольких значений int, выделяется память кучи. Теперь эта память доступна, когда вы передаете ее функциям, и эта память действительна до тех пор, пока не будет запущено программирование, пока кто-то не вызовет оператора удаления. Таким образом, вы можете передать этот указатель из readNumbers, main и printNumber, и он действителен.

Во втором случае вы создали массив int как локальную переменную в функции, поэтому он создается в стеке. Область действия локальной переменной - только до выполнения функции. В вашем примере readNumbers создал массив, и как только функция завершится, стек очищается. То есть все локальные переменные, созданные в функции, больше не действительны. Следовательно, когда вы используете это место в памяти в других функциях, таких как main и printNumbers, оно будет давать неопределенное поведение. Иногда ожидается результат, иногда неверный результат. Поэтому вам нужно быть осторожным, что вы передаете или возвращаете от одной функции к другой.

Если вы все же хотите получить ожидаемый результат во втором случае, объявите массив как stati c.

Надеюсь, это поможет.

1 голос
/ 08 мая 2020

Во втором фрагменте кода ваш массив размещается в стеке внутри функции readNumbers. Затем вы возвращаете указатель на эту стековую память вызывающей функции. Эта память больше недействительна при запуске printNumbers. Вероятно, местные жители переписали его в printNumbers.

Выделите массив в основном, и тогда второй пример также должен работать.

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