Как этот display () отображает значения массива, когда я не объявил свой массив динамически - PullRequest
0 голосов
/ 18 июня 2019

Насколько мне известно, после вызова функции в c ++ ее память освобождается для других переменных.Если он не выделяется другой переменной, то переменная должна выделять память динамически.Я запутался, как функция display () отображает значения массива, когда она не выделяется динамически.

#include<iostream>
using namespace std;
void init_values(int arr[]){
    for(int i=0;i<100;i++){
        arr[i]=i;
    }
}
void display(int arr[]){
    for(int i=0;i<100;i++){
        cout<<arr[i] << " ";
    }
}
int main(){
    int arr[100];
    init_values(arr);
    display(arr);
}

Я ожидал, что функция отобразит мусор или выдаст ошибку.Но он отображал значения правильно.

1 Ответ

0 голосов
/ 19 июня 2019
void init_values(int arr[]){
    for(int i=0;i<100;i++){ // i is created here
        arr[i]=i;
    } // i goes out of scope here
}

Здесь нет проблем, нет попытки использовать i позже.

void display(int arr[]){
    for(int i=0;i<100;i++){ // i is created here
        cout<<arr[i] << " ";
    } // i goes out of scope here

Опять нет проблем.

int main(){
    int arr[100]; // arr is created here
    init_values(arr);
    display(arr);
} // arr goes out of scope here

Когда мы вызываем init_values и display, arr все еще находится в области видимости, поскольку его время жизни заканчивается в конце области, в которой он был создан. Таким образом, он все еще находится в области видимости во время этих вызовов функций.

Теперь это будет проблемой:

int *init_values(void){
    int arr[100];
    for(int i=0;i<100;i++){
        arr[i]=i;
    }
    return arr;
}

Почему? Подумайте об этом:

int *init_values(void){
    int arr[100]; // arr is created here
    for(int i=0;i<100;i++){
        arr[i]=i;
    }
    return arr;
} // arr goes out of scope here

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

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