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
не существует после выхода из этой функции. Возвращаемое значение этой функции не может быть безопасно использовано. Ваш код этого не делает.