Kodėl reikalingas dinaminis atminties paskirstymas, jei galiu sukurti masyvą?

Perskaičiau apie dinaminį atminties priskyrimą ir statinį atminties priskyrimą ir radome šiuos duomenis apie dinaminį atminties paskirstymą:

Ankstesniuose skyriuose aptartose programose visi atminties reikalavimai buvo nustatyti prieš programos vykdymą apibrėžiant būtinus kintamuosius. Tačiau gali būti atvejų, kai atminties programos poreikiai gali būti nustatyti tik vykdymo metu. Pavyzdžiui, kai reikiama atmintis priklauso nuo vartotojo įvesties.

Todėl C ++ sistemoje parašiau šią programą:

 #include <iostream> int main() { int n = 0; int i = 0; std::cout << "Enter size: "; std::cin >> n; int vector[n]; for (i=0; i<n; i++) { vector[i] = i; } return 0; } 

Ši programa veikia. Aš nesuprantu, kaip tai veikia. Kada čia nustatomas dydis? Kaip šiuo atveju paskirstomas vektorius?

5
13 дек. gruodžio 13 d. 2018-12-13 13:50 '18, 15:50 2018-12-13 13:50
@ 3 atsakymai

Pagal tai (mano pažymėtas):

Kintamojo ilgio automatinės matricos yra leidžiamos ISO C99, o išplėtimas GCC priima juos C90 režimu ir C ++. Šios matricos yra deklaruojamos kaip bet kurios kitos automatinės matricos, tačiau jų ilgis nėra nuolatinė išraiška. Saugojimas paskirstomas deklaracijos vietoje ir išleidžiamas išeinant iš reklamos bloko, kuriame yra skelbimas, ploto .

Atkreipkite dėmesį, kad tai tik pratęsimas ir jis neveiks kiekviename kompiliatoriuje, pvz., Jis neveikia MSVC (gaunu klaidą „išraiška turi turėti pastovią vertę“).

7
13 дек. Blaze atsakė 13 d. 2018-12-13 13:53 '18, 13:53 2018-12-13 13:53

Kitas svarbus gcc dokumentas:

Galite naudoti asigna funkciją, kad gautumėte efektą, kuris yra labai panašus į kintamo ilgio matricas. Dozavimo funkcija yra prieinama daugelyje kitų C realizacijų (bet ne visų). Kita vertus, įvairaus ilgio matricos yra elegantiškesnės.

Yra ir kitų skirtumų tarp dviejų metodų. Dotacijos paskirstyta erdvė egzistuoja, kol grąžinama funkcija. Kintamo ilgio matricos vieta paleidžiama, kai baigiasi masyvo vardo apimtis. (Jei toje pačioje funkcijoje naudojate kintamo ilgio matricas ir paskirstymus, atlaisvindami įvairaus ilgio masyvą, taip pat bus išleista visa, kas neseniai buvo paskirta naudojant asigną.)

asigna - priskirti atmintį, kuri yra automatiškai atlaisvinta. Ši laikina erdvė automatiškai atlaisvinama, kai funkcija, kuri vadinama asigna (), grįžta į savo skambintoją. Funkcija asigna () priklauso nuo mašinos ir kompiliatoriaus . Kai kurioms programoms jos naudojimas gali būti efektyvesnis nei naudojant malloc (3) ir nemokamą (3).

Todėl man atrodo, kad tie patys teiginiai taikomi kaip ir asignoms:

Nėra klaidų indikacijos, jei krūvos rėmas negali būti pratęstas. (Tačiau po nesėkmingos paskirties vietos programa gali gauti SIGSEGV signalą, jei bandys pasiekti nepaskirstytą erdvę.)

dinaminio atminties paskirstymo naudojimas yra saugesnis nei kintamo ilgio matricos.

0
13 дек. Atsakymą Dmytro Dadyka pateikė gruodžio 13 d. 2018-12-13 14:43 '18, 14:43 pm 2018-12-13 14:43

Minėtas kodas sukurs naujausios kompiliatoriaus versijos klaidą. Šis kodas veiks senoje „DOSBOX“ versijoje.

Masyvo dydis turi būti pastovus sveikasis skaičius.

Taigi galite jį apibrėžti dviem būdais.

1. # apibrėžti Macron

 #include<iostream> #define n 5 main() { ... ... int array[n]; } 

Raktinis žodis 2.const

 #include<iostream> .... main() { int x; cout << "Enter Size Of Array"; cin >> x; const int n = x; int array[n]; ... ... } 
-3
13 дек. Atsakymas pateikiamas vasarą 13 d. 2018-12-13 15:06 '18, 15:06 2018-12-13 15:06