В чем разница между статическим и динамическим объявлением массива

Я новичок в программировании на C++, я узнал, что все статические переменные выделяются во время компиляции в памяти стека, поэтому их размер должен быть известен перед компиляцией компилятором.

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

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

Итак, в чем разница между ними, кроме того факта, что один находится в куче? как и оба массива имеют размер только n

#include<bits/stdc++.h>
using namespace std;

main(){
  int n; 
  cin>>n;
  
  int arr1[n];
  int *arr2 = new int[n];
  
  for(int i=0; i<n; ++i){ 
    arr1[i] = i;
    arr2[i] = i;
  }
  
  for(int i=0; i<n; ++i){
    cout<<arr1[i]<<" "<<arr2[i]<<endl;
  }
  
}

ввод: 1000

выход:

0 0
1 1
2 2
3 3
.
.
.
.
(so on till)
999 999

person Kaneki    schedule 07.06.2021    source источник
comment
int arr1[n]; на самом деле не компилируется. Добавьте -pedantic-errors к своим параметрам компилятора, чтобы не дать GCC скомпилировать этот нестандартный код. В отличие от C, C++ не имеет VLA.   -  person NathanOliver    schedule 07.06.2021
comment
и int arr1[n]; в любом случае не является статическим массивом в C.   -  person Weather Vane    schedule 07.06.2021
comment
Это очень похоже на этот вопрос, заданный ранее сегодня, не говоря уже о дубликатах, связанных с ним.   -  person Nathan Pierson    schedule 07.06.2021
comment
У вас есть стек и куча назад. Куча обычно используется для статического хранения, а стек — для динамического.   -  person Tim Randall    schedule 07.06.2021
comment
@NathanOliver Я почти уверен, что кадр стека используется для локальных переменных, которые являются временными (динамическими), и что malloc дает вам кучу памяти   -  person Tim Randall    schedule 07.06.2021
comment
@TimRandall Стек используется для всех переменных с автоматической продолжительностью хранения (в системах, которые это делают), поэтому глобальные, статические и локальные переменные живут в стеке. Переменная с длительностью динамического хранения (с использованием new/new[]) будет жить в куче.   -  person NathanOliver    schedule 07.06.2021
comment
В стеке будут жить только переменные продолжительности автоматического хранения. Переменная длительности статического хранения (включая объявленные на уровне пространства имен и переменные-члены, явно определяемые как статические) находятся в статическом хранилище. Те, что имеют продолжительность локального хранилища потока, живут в локальном хранилище потока. Те, которые имеют динамическую продолжительность хранения, живут в куче.   -  person Stephen M. Webb    schedule 07.06.2021
comment
Или в колесах хомяка и волшебной пыли, если это то, что разработчик использовал для динамической памяти. @Tim Некоторое хорошее чтение на сортировка автоматических и динамических   -  person user4581301    schedule 07.06.2021
comment
Я признаю, что я перепутал динамику и автоматику. Я все еще уверен, что это неправильно. static variables are allocated at compile time on stack memory   -  person Tim Randall    schedule 07.06.2021
comment
Ага. static переменные выделяются при запуске программы, а не из автоматического хранилища.   -  person user4581301    schedule 07.06.2021