Как Π·Π°Π΄Π°Ρ‚ΡŒ динамичСский массив Π² си: ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти, динамичСскиС массивы

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ДинамичСски распрСдСлСнный массив C++

ΠœΠ°ΡΡΠΈΠ²Ρ‹Β β€” это ΠΎΡ‡Π΅Π½ΡŒ ваТная структура Π΄Π°Π½Π½Ρ‹Ρ… Π²Β C ++, которая слуТит для хранСния схоТих Ρ‚ΠΈΠΏΠΎΠ² элСмСнтов. ΠœΠ°ΡΡΠΈΠ²Ρ‹ в основном дСлятся Π½Π°Β Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ°: статичСскиС и динамичСскиС. БтатичСскиС массивы — это тС, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π²Β ΠΊΠΎΠ΄Π΅, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ динамичСскиС массивы — это тС, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… опрСдСляСтся во врСмя выполнСния. В этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹Β ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ о динамичСских массивах Π²Β C ++. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹Β ΡƒΠ΄Π΅Π»ΠΈΠΌ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈΡ…Β Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ и освобоТдСнию, подСлившись с вами ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Π²Β UbuntuΒ 20.04.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

  1. ДинамичСски Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ массивы Π²Β C ++
  2. ИспользованиС динамичСски Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Ρ… массивов Π²Β C ++ Π²Β UbuntuΒ 20.04
  3. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ДинамичСски Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ массивы Π²Β C ++

ΠœΡ‹Β ΡƒΠΆΠ΅ заявляли, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ динамичСского массива опрСдСляСтся во врСмя выполнСния. Однако ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ вопрос, Π·Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΡƒΠΆΠ½Ρ‹ динамичСски выдСляСмыС массивы, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹Β ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ статичСскиС массивы? Π§Ρ‚ΠΎΒ ΠΆ, ΠΈΠ½ΠΎΠ³Π΄Π° Π²Ρ‹Β ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚Π΅ΡΡŒ с такими ситуациями, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ массива ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ нСизвСстСн. В этих случаях Π²Ρ‹Β ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива ΠΊΠ°ΠΊ Π²Π²ΠΎΠ΄ ΠΎΡ‚Β ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ во врСмя выполнСния.

Но это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ со статичСскими массивами, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ статичСского массива, ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Β ΠΊΠΎΠ΄Π΅, Π½Π΅Β ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½. Π—Π΄Π΅ΡΡŒ Π²Β ΠΈΠ³Ρ€Ρƒ Π²ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ динамичСски выдСляСмыС массивы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ массивы любого ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° во врСмя выполнСния. ДинамичСскиС массивы Π²Β C ++ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΒ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова Β«newΒ». Π’ΠΎΡ‡Π½Ρ‹ΠΉ синтаксис Π±ΡƒΠ΄Π΅Ρ‚ пояснСн ΠΏΠΎΠ·ΠΆΠ΅ в этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Однако здСсь слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚: статичСскиС массивы всСгда ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ в стСкС вашСй систСмы, и ваша систСма сама Π±Π΅Ρ€Π΅Ρ‚ на сСбя ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ за освобоТдСниС своСго стСка послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π‘Β Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, динамичСски выдСляСмыС массивы всСгда ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π²Β ΠΊΡƒΡ‡Π΅, ΠΈΒ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡƒΡŽ динамичСским массивом. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, обсуТдаСмый Π½ΠΈΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ использованиС динамичСски выдСляСмых массивов.

ИспользованиС динамичСски Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Ρ… массивов Π²Β C ++ Π²Β UbuntuΒ 20.

04

В этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹Β Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒ вас ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ динамичСски выдСляСмыС массивы Π²Β C ++. ΠœΡ‹Β Ρ€Π°ΡΡΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΈΒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ динамичСский массив во врСмя выполнСния. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹Β ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ элСмСнты динамичСски выдСляСмого массива. НаконСц, ΠΌΡ‹Β ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π²Π°ΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡƒΡŽ динамичСским массивом Π²Β C ++. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ всС это, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π°Β ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ:

В этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π°Β C ++ у нас Π΅ΡΡ‚ΡŒ функция main (), Π²Β ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹Β ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число num. Π­Ρ‚ΠΎ Ρ†Π΅Π»ΠΎΠ΅ число Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ нашСго динамичСского массива, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мы создадим ΠΏΠΎΠ·ΠΆΠ΅. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹Β ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ»ΠΈ Π½Π°Β Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ сообщСниС, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ввСсти любой Ρ€Π°Π·ΠΌΠ΅Ρ€ по своСму Π²Ρ‹Π±ΠΎΡ€Ρƒ для динамичСского массива. ПослС этого мы взяли этот Ρ€Π°Π·ΠΌΠ΅Ρ€ в качСствС Π²Π²ΠΎΠ΄Π° ΠΎΡ‚Β ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π—Π°Ρ‚Π΅ΠΌ ΡΒ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Β«int * array = new int (num)Β» ΠΌΡ‹Β ΠΎΠ±ΡŠΡΠ²ΠΈΠ»ΠΈ динамичСский массив во врСмя выполнСния, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Β«numΒ». «Массив» относится ΠΊΒ ΠΈΠΌΠ΅Π½ΠΈ этого массива.

ПослС этого мы снова ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ»ΠΈ Π½Π°Β Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ сообщСниС, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ввСсти элСмСнты этого массива. За этим сообщСниСм слСдуСт Ρ†ΠΈΠΊΠ» for, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ повторяСтся Π΄ΠΎΒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива, Ρ‚.Π΅. num. В этом Ρ†ΠΈΠΊΠ»Π΅ мы взяли элСмСнты этого динамичСского массива в качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Β ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ динамичСский массив Π±Ρ‹Π» Π·Π°ΠΏΠΎΠ»Π½Π΅Π½, ΠΌΡ‹Β Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π΅Π³ΠΎ элСмСнты Π½Π°Β Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ мы сначала ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ»ΠΈ сообщСниС ΡΒ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Β«coutΒ». Π—Π°Ρ‚Π΅ΠΌ у нас Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ†ΠΈΠΊΠ» for, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ снова ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ динамичСского массива. В этом Ρ†ΠΈΠΊΠ»Π΅ мы просто ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ»ΠΈ элСмСнты массива Π½Π°Β Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅. ПослС этого ΠΌΡ‹Β Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°Π½ΡΡ‚ΡƒΡŽ этим динамичСским массивом, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹Β ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«delete [] arrayΒ». НаконСц, на всякий случай ΠΌΡ‹Β ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«array = NULLΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ссылку NULL динамичСского массива, ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹Β Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ освободили.

ПослС написания этого ΠΊΠΎΠ΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹Β Π΅Π³ΠΎ скомпилировали ΠΈΒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ, нас сначала попросили ввСсти Ρ€Π°Π·ΠΌΠ΅Ρ€ динамичСского массива. ΠœΡ‹Β Ρ…ΠΎΡ‚Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наш динамичСский массив ΠΈΠΌΠ΅Π» Ρ€Π°Π·ΠΌΠ΅Ρ€ Β«5Β», ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π°Β ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½ΠΈΠΆΠ΅:

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹Β Π²Π²Π΅Π»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ нашСго динамичСского массива, нас попросили Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ. Для этого ΠΌΡ‹Β Π²Π²Π΅Π»ΠΈ числа ΠΎΡ‚Β 1Β Π΄ΠΎΒ 5, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π°Β ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ:

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹Β Π½Π°ΠΆΠ°Π»ΠΈ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Enter послС заполнСния нашСго динамичСского массива, Π΅Π³ΠΎ элСмСнты Π±Ρ‹Π»ΠΈ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Ρ‹ Π½Π°Β Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ освобоТдСниС динамичСской памяти, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ об этом Ρ‚Π°ΠΊΠΆΠ΅ появилось Π½Π°Β Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π°Β ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½ΠΈΠΆΠ΅:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹Β Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚ΠΎΡ‚Β ΠΆΠ΅ ΠΊΠΎΠ΄. До сих ΠΏΠΎΡ€ ΠΌΡ‹Β ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ динамичСский массив Π²Β C ++ ΠΈΒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π΅Π³ΠΎ элСмСнты Π½Π°Β Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅. Π₯отя ΠΌΡ‹Β Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ Π²Β Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΊΠΎΠ΄ для освобоТдСния этой памяти, Ρ‚Π΅ΠΌ Π½Π΅Β ΠΌΠ΅Π½Π΅Π΅, мы всС Π΅Ρ‰Π΅ Π½Π΅Β ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Π±Ρ‹Π»Π°Β Π»ΠΈ освобоТдСна занятая динамичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Для этого мы попытаСмся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ к части этой динамичСской памяти послС СС освобоТдСния. Если доступ ΠΊΒ Π½Π΅ΠΌΡƒ осущСствлСн ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ освобоТдСниС памяти Π½Π΅Β ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Однако, Ссли мы встрСтим ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ сообщСниС об ошибкС ΠΏΡ€ΠΈ доступС к этой памяти послС СС освобоТдСния, это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ наша занятая динамичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ освобоТдСна. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ это, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π°Β ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄:

В этом ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ C ++ мы просто Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ строку Π²Β ΠΊΠΎΠ½Π΅Ρ† нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚ΠΎΒ Π΅ΡΡ‚ΡŒ cout << array [2]. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹Β Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊΒ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌΡƒ индСксу нашСго динамичСского массива послС освобоТдСния Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ им памяти.

Когда мы скомпилировали ΠΈΒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ этот ΠΊΠΎΠ΄, ΠΎΠ½Β Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эта послСдняя строка Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°, Π±Ρ‹Π»Π° сгСнСрирована ошибка, относящаяся к ошибкС сСгмСнтации, Ρ‡Ρ‚ΠΎ на самом Π΄Π΅Π»Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Β ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ к области памяти, которая большС нС сущСствуСт.. Π­Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π°Β ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½ΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ освобоТдСниС нашСго динамичСского массива ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ. Π­Ρ‚ΠΎΡ‚ Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° доступа к области памяти, которая большС нС сущСствуСт, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ к ошибкС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, а нС к ошибкС компиляции. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, и вы нС смоТСтС ΠΎΡ‚Π»ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ β€‹β€‹ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΏΠΎΠΊΠ° нС запуститС свой ΠΊΠΎΠ΄.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ Π±Ρ‹Π»Π° Π½Π°Ρ†Π΅Π»Π΅Π½Π° Π½Π°Β Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒ вас ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ динамичСски выдСляСмыС массивы Π²Β C ++ Π²Β UbuntuΒ 20.04. Для этого мы сначала ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ использования динамичСски выдСляСмых массивов Π²Β C ++. Π—Π°Ρ‚Π΅ΠΌ мы рассмотрСли ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‰ΠΈΠΉ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ динамичСскиС массивы ΠΈΒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ними Π²Β C ++. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹Β Ρ‚Π°ΠΊΠΆΠ΅ подСлились ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ освобоТдСния динамичСских массивов. Π˜Π·ΡƒΡ‡ΠΈΠ² это руководство, Π²Ρ‹Β ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ прСдставлСниС ΠΎΒ Ρ€Π°Π±ΠΎΡ‚Π΅ с динамичСскими массивами Π²Β C ++.

ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² C++ для 2D ΠΈ 3D массива

Π’ этом постС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² C++ для ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… массивов.

1. ΠžΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… массивах.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#include <iostream>

Β 

#define N 10

Β 

// ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива Π² C++

int main()

{

Β Β Β Β // динамичСски выдСляСм ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ `N`

Β Β Β Β int* A = new int[N];

Β 

Β Β Β Β // присваиваСм значСния Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти

Β Β Β Β for (int i = 0; i < N; i++) {

Β Β Β Β Β Β Β Β A[i] = i + 1;

Β Β Β Β }

Β 

Β Β Β Β // ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив

Β Β Β Β for (int i = 0; i < N; i++) {

Β Β Β Β Β Β Β Β std::cout << A[i] << » «;Β Β Β Β // ΠΈΠ»ΠΈ *(А + i)

Β Β Β Β }

Β 

Β Β Β Β // освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ

Β Β Β Β delete[] A;

Β 

Β Β Β Β return 0;

}

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒΒ Β Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄

2.

Π”Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив

1. ИспользованиС ΠΎΠ΄Π½ΠΎΠ³ΠΎ указатСля

Π’ этом ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΌΡ‹ просто выдСляСм ΠΎΠ΄ΠΈΠ½ большой Π±Π»ΠΎΠΊ памяти Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ M Γ— N динамичСски ΠΈ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΡƒ указатСля для индСксации Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

#include <iostream>

Β 

// ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° `M Γ— N`

#define M 4

#define N 5

Β 

// ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для 2D-массива Π² C++

int main()

{

Β Β Β Β // динамичСски выдСляСм ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ `M Γ— N`

Β Β Β Β int* A = new int[M * N];

Β 

Β Β Β Β // присваиваСм значСния Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти

Β Β Β Β for (int i = 0; i < M; i++)

Β Β Β Β {

Β Β Β Β Β Β Β Β for (int j = 0; j < N; j++) {

Β Β Β Β Β Β Β Β Β Β Β Β *(A + i*N + j) = rand() % 100;

Β Β Β Β Β Β Β Β }

Β Β Β Β }

Β 

Β Β Β Β // ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив

Β Β Β Β for (int i = 0; i < M; i++)

Β Β Β Β {

Β Β Β Β Β Β Β Β for (int j = 0; j < N; j++) {

Β Β Β Β Β Β Β Β Β Β Β Β std::cout << *(A + i*N + j) << » «;Β Β Β Β Β Β Β Β // ΠΈΠ»ΠΈ (A + i*N)[j])

Β Β Β Β Β Β Β Β }

Β Β Β Β Β Β Β Β std::cout << std::endl;

Β Β Β Β }

Β 

Β Β Β Β // освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ

Β Β Β Β delete[] A;

Β 

Β Β Β Β return 0;

}

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒΒ Β Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄

2.

ИспользованиС массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ динамичСски ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ M Π° Π·Π°Ρ‚Π΅ΠΌ динамичСски Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ N для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

#include <iostream>

Β 

// ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° `M Γ— N`

#define M 4

#define N 5

Β 

// ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² C++ для 2D-массива

int main()

{

Β Β Β Β // динамичСски ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° `M`

Β Β Β Β int** A = new int*[M];

Β 

Β Β Β Β // динамичСски выдСляСм ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ `N` для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки

Β Β Β Β for (int i = 0; i < M; i++) {

Β Β Β Β Β Β Β Β A[i] = new int[N];

Β Β Β Β }

Β 

Β Β Β Β // присваиваСм значСния Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти

Β Β Β Β for (int i = 0; i < M; i++)

Β Β Β Β {

Β Β Β Β Β Β Β Β for (int j = 0; j < N; j++) {

Β Β Β Β Β Β Β Β Β Β Β Β A[i][j] = rand() % 100;

Β Β Β Β Β Β Β Β }

Β Β Β Β }

Β 

Β Β Β Β // ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив

Β Β Β Β for (int i = 0; i < M; i++)

Β Β Β Β {

Β Β Β Β Β Β Β Β for (int j = 0; j < N; j++) {

Β Β Β Β Β Β Β Β Β Β Β Β std::cout << A[i][j] << » «;

Β Β Β Β Β Β Β Β }

Β Β Β Β Β Β Β Β std::cout << std::endl;

Β Β Β Β }

Β 

Β Β Β Β // освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° удалСния

Β Β Β Β for (int i = 0; i < M; i++) {

Β Β Β Β Β Β Β Β delete[] A[i];

Β Β Β Β }

Β Β Β Β delete[] A;

Β 

Β Β Β Β return 0;

}

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒΒ Β Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄

3.

Π’Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив

1. ИспользованиС ΠΎΠ΄Π½ΠΎΠ³ΠΎ указатСля

Как Π²ΠΈΠ΄Π½ΠΎ для Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива, ΠΌΡ‹ выдСляСм ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ X Γ— Y Γ— Z динамичСски ΠΈ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΡƒ указатСля для индСксации Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

#include <iostream>

Β 

// ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° `X Γ— Y Γ— Z`

#define X 2

#define Y 3

#define Z 4

Β 

// ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² C++ для 3D-массива

int main()

{

Β Β Β Β // динамичСски выдСляСм ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ `X Γ— Y Γ— Z`

Β Β Β Β int* A = new int[X * Y * Z];

Β 

Β Β Β Β // присваиваСм значСния Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти

Β Β Β Β for (int i = 0; i < X; i++)

Β Β Β Β {

Β Β Β Β Β Β Β Β for (int j = 0; j < Y; j++)

Β Β Β Β Β Β Β Β {

Β Β Β Β Β Β Β Β Β Β Β Β for (int k = 0; k < Z; k++) {

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β *(A + i*Y*Z + j*Z + k) = rand() % 100;

Β Β Β Β Β Β Β Β Β Β Β Β }

Β Β Β Β Β Β Β Β }

Β Β Β Β }

Β 

Β Β Β Β // ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив

Β Β Β Β for (int i = 0; i < X; i++)

Β Β Β Β {

Β Β Β Β Β Β Β Β for (int j = 0; j < Y; j++)

Β Β Β Β Β Β Β Β {

Β Β Β Β Β Β Β Β Β Β Β Β for (int k = 0; k < Z; k++) {

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β std::cout << *(A + i*Y*Z + j*Z + k) << » «;

Β Β Β Β Β Β Β Β Β Β Β Β }

Β Β Β Β Β Β Β Β Β Β Β Β std::cout << std::endl;

Β Β Β Β Β Β Β Β }

Β Β Β Β Β Β Β Β std::cout << std::endl;

Β Β Β Β }

Β 

Β Β Β Β // освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ

Β Β Β Β delete[] A;

Β 

Β Β Β Β return 0;

}

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒΒ Β Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄

2.

ИспользованиС Ρ‚Ρ€ΠΎΠΉΠ½ΠΎΠ³ΠΎ указатСля

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

#include <iostream>

Β 

// ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° `X Γ— Y Γ— Z`

#define X 2

#define Y 3

#define Z 4

Β 

// ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для 3D-массива Π² C++

int main()

{

Β Β Β Β int*** A = new int**[X];

Β 

Β Β Β Β for (int i = 0; i < X; i++)

Β Β Β Β {

Β Β Β Β Β Β Β Β A[i] = new int*[Y];

Β Β Β Β Β Β Β Β for (int j = 0; j < Y; j++) {

Β Β Β Β Β Β Β Β Β Β Β Β A[i][j] = new int[Z];

Β Β Β Β Β Β Β Β }

Β Β Β Β }

Β 

Β Β Β Β // присваиваСм значСния Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти

Β Β Β Β for (int i = 0; i < X; i++)

Β Β Β Β {

Β Β Β Β Β Β Β Β for (int j = 0; j < Y; j++)

Β Β Β Β Β Β Β Β {

Β Β Β Β Β Β Β Β Β Β Β Β for (int k = 0; k < Z; k++) {

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β A[i][j][k] = rand() % 100;

Β Β Β Β Β Β Β Β Β Β Β Β }

Β Β Β Β Β Β Β Β }

Β Β Β Β }

Β 

Β Β Β Β // ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив

Β Β Β Β for (int i = 0; i < X; i++)

Β Β Β Β {

Β Β Β Β Β Β Β Β for (int j = 0; j < Y; j++)

Β Β Β Β Β Β Β Β {

Β Β Β Β Β Β Β Β Β Β Β Β for (int k = 0; k < Z; k++) {

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β std::cout << A[i][j][k] << » «;

Β Β Β Β Β Β Β Β Β Β Β Β }

Β Β Β Β Β Β Β Β Β Β Β Β std::cout << std::endl;

Β Β Β Β Β Β Β Β }

Β Β Β Β Β Β Β Β std::cout << std::endl;

Β Β Β Β }

Β 

Β Β Β Β // освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ

Β Β Β Β for (int i = 0; i < X; i++)

Β Β Β Β {

Β Β Β Β Β Β Β Β for (int j = 0; j < Y; j++) {

Β Β Β Β Β Β Β Β Β Β Β Β delete[] A[i][j];

Β Β Β Β Β Β Β Β }

Β Β Β Β Β Β Β Β delete[] A[i];

Β Β Β Β }

Β 

Β Β Β Β delete[] A;

Β 

Β Β Β Β return 0;

}

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒΒ Β Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄

Π’ΠΎΡ‚ ΠΈ всС, Ρ‡Ρ‚ΠΎ касаСтся динамичСского выдСлСния памяти Π² C++ для 2D- ΠΈ 3D-массивов.

ΠžΡ†Π΅Π½ΠΈΡ‚ΡŒ этот пост

Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ 4.9/5. ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ голосов: 48

Голосов ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚! Π‘ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΡ‚ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ этот пост.

Π‘ΠΎΠΆΠ°Π»Π΅Π΅ΠΌ, Ρ‡Ρ‚ΠΎ этот пост Π½Π΅ оказался для вас ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ!

РасскаТитС, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ этот пост?


Бпасибо Π·Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅.

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ наш ΠΎΠ½Π»Π°ΠΉΠ½-компилятор Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π² коммСнтариях, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ C, C++, Java, Python, JavaScript, C#, PHP ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ популярныС языки программирования.

Как ΠΌΡ‹? ΠŸΠΎΡ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠΉΡ‚Π΅ нас своим Π΄Ρ€ΡƒΠ·ΡŒΡΠΌ ΠΈ ΠΏΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ Π½Π°ΠΌ расти. Π£Π΄Π°Ρ‡Π½ΠΎΠ³ΠΎ кодирования πŸ™‚


ДинамичСскоС Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅

ДинамичСскоС Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти

БущСствуСт Π΄Π²Π° способа выдСлСния памяти для хранСния Π΄Π°Π½Π½Ρ‹Ρ…:
  1. ВрСмя компиляции (ΠΈΠ»ΠΈ статичСскоС) РаспрСдСлСниС
    • ΠŸΠ°ΠΌΡΡ‚ΡŒ для ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… выдСляСтся компилятором
    • Π’ΠΎΡ‡Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Ρ‚ΠΈΠΏ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ извСстны Π²ΠΎ врСмя компиляции
    • Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ для стандартных объявлСний массива Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ константа
  2. ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти
    • ΠŸΠ°ΠΌΡΡ‚ΡŒ выдСляСтся «Π½Π° Π»Π΅Ρ‚Ρƒ» Π²ΠΎ врСмя выполнСния
    • динамичСски выдСляСмоС пространство, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π² извСстном ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ сСгмСнтС ΠΊΠ°ΠΊ ΠΊΡƒΡ‡Π°
      ΠΈΠ»ΠΈ свободноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅
    • ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ количСство мСста ΠΈΠ»ΠΈ количСство элСмСнтов. компилятором Π·Π°Ρ€Π°Π½Π΅Π΅.
    • Для динамичСского выдСлСния памяти ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти

  • ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ динамичСски Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ мСсто для хранСния, ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… «Π½Π° Π»Π΅Ρ‚Ρƒ»
  • По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ динамичСскоС Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄Π²ΡƒΡ… шагов:
    1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ динамичСского пространства.
    2. Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ своСго адрСса Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ мСсто ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ)
  • Для динамичСского выдСлСния памяти Π² C++ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ . ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€.
  • ОсвобоТдСниС:
    • ОсвобоТдСниС β€” это «очистка» пространства, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΄Π°Π½Π½Ρ‹Ρ…
    • ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции автоматичСски ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π½Π° основС ΠΈΡ… извСстная ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ (это Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия для «автоматичСского» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅)
    • ОсвобоТдСниС динамичСски созданных ΠΏΡ€ΠΎΠ±Π΅Π»
    • Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ мСста с Π½ΠΎΠ²Ρ‹ΠΌ

  • Для динамичСского распрСдСлСния пространства ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π½ΠΎΠ²Ρ‹ΠΉ , Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Ρ‚ΠΈΠΏ .
     Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»; // динамичСски выдСляСт int
     Π½ΠΎΠ²Ρ‹ΠΉ Π΄Π²ΠΎΠΉΠ½ΠΈΠΊ; // динамичСски выдСляСт Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ
     
  • ΠŸΡ€ΠΈ динамичСском создании массива ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΡƒ, Π½ΠΎ Ρ€Π°ΡΡΡ‚Π°Π²ΡŒΡ‚Π΅ скобки с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ послС Ρ‚ΠΈΠΏΠ°:
     Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» [40]; // динамичСски выдСляСт массив ΠΈΠ· 40 Ρ†Π΅Π»Ρ‹Ρ… чисСл
     Π½ΠΎΠ²Ρ‹ΠΉ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ [Ρ€Π°Π·ΠΌΠ΅Ρ€]; // динамичСски выдСляСт массив Π΄Π²ΠΎΠΉΠ½ΠΈΠΊΠΎΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€Π°
                       // ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ
     
  • Π­Ρ‚ΠΈ заявлСния Π²Ρ‹ΡˆΠ΅ сами ΠΏΠΎ сСбС Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ пространства Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΠΌΠ΅Π½! НО, Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ адрСс Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ пространства, ΠΈ этот адрСс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ хранится Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅:
     ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» * Ρ€; // ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ p
     Ρ€ = Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»; // динамичСски выдСляСм int ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ адрСс Π² p
     Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ * Π΄; // ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ d
     Π΄ = Π½ΠΎΠ²Ρ‹ΠΉ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ; // динамичСски выдСляСм Π΄Π²ΠΎΠΉΠ½ΠΈΠΊ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ адрСс Π² d
     // ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² однострочных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ…
     ΠΈΠ½Ρ‚ Ρ… = 40;
     int * list = Π½ΠΎΠ²Ρ‹ΠΉ int[x];
     ΠΏΠΎΠΏΠ»Π°Π²ΠΎΠΊ * числа = Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΠΏΠ»Π°Π²ΠΎΠΊ[x+10];
     
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ указатСля Π½Π° вСрная Ρ†Π΅Π»ΡŒ (ΠΈ самая ваТная).

Доступ ΠΊ динамичСски созданному пространству

  • Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ пространство Π±Ρ‹Π»ΠΎ динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это?
  • Для ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ. Π Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ для достиТСния динамичСски созданной Ρ†Π΅Π»ΠΈ:
      int * p = Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»; // динамичСскоС Ρ†Π΅Π»ΠΎΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ p
      *Ρ€ = 10; // присваиваСт 10 динамичСскому Ρ†Π΅Π»ΠΎΠΌΡƒ числу
      cout
     
  • Для динамичСски создаваСмых массивов ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ смСщСниС указатСля, Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΊΠ°ΠΊ имя массива ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² скобках:
      double * numList = Π½ΠΎΠ²Ρ‹ΠΉ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ [Ρ€Π°Π·ΠΌΠ΅Ρ€]; // динамичСский массив
      для (Ρ†Π΅Π»ΠΎΠ΅ я = 0; я
     

ОсвобоТдСниС динамичСской памяти

  • Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ new, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ . Один ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранится адрСс освобоТдаСмого пространства:
      int * ptr = Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»; // динамичСски созданный int
      // . ..
      ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ; // удаляСт ΠΏΡ€ΠΎΠ±Π΅Π», Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ptr
     
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ptr всС Π΅Ρ‰Π΅ сущСствуСт Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Π­Ρ‚ΠΎ имСнованная пСрСмСнная, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия ΠΈ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ компиляции. врСмя. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ:
      ptr = Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» [10]; // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ p Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ массив
     
  • Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ динамичСский массив, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ эту Ρ„ΠΎΡ€ΠΌΡƒ:
      ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ []  name_of_pointer  ;
     
    ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
      int * список = Π½ΠΎΠ²Ρ‹ΠΉ int[40]; // динамичСский массив
      ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ [] список; // освобоТдаСт массив
      список = 0; // сбрасываСм список Π½Π° Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ
     
    ПослС освобоТдСния мСста всСгда ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° null, Ссли Π²Ρ‹ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Π΅Π³ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΡƒΡŽ Ρ†Π΅Π»ΡŒ справа ΠΏΡ€ΠΎΡ‡ΡŒ.
  • На рассмотрСниС: Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π²Ρ‹ Π½Π΅ смоТСтС ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ динамичСскоС памяти, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ с Π½ΠΈΠΌ? (Ρ‚.Π΅. ΠΏΠΎΡ‡Π΅ΠΌΡƒ освобоТдСниС Π²Π°ΠΆΠ½ΠΎ?)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния: динамичСскоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива

Если Ρƒ вас Π΅ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ массив, ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ (Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ массив ячССк ΠΊ Π½Π΅ΠΌΡƒ), Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ячСйки ΠΊ старым. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ массивы хранятся Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ памяти, ΠΈ Π²Ρ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° Π»ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ сразу послС массива для Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ процСсс Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π΅Ρ‰Π΅ нСсколько шаги. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования цСлочислСнного массива. скаТСм это исходный массив:
 int * список = Π½ΠΎΠ²Ρ‹ΠΉ int[Ρ€Π°Π·ΠΌΠ΅Ρ€];
 

Π― Ρ…ΠΎΡ‡Ρƒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² массивС с ΠΈΠΌΠ΅Π½Π΅ΠΌ list Π±Ρ‹Π»ΠΎ мСсто Π΅Ρ‰Π΅ Π½Π° 5 Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² (ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ старый ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½).
Π•ΡΡ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ основных шага.

  1. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ массив ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€. (Для этого Π²Π°ΠΌ понадобится Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ).
     int * temp = Π½ΠΎΠ²Ρ‹ΠΉ int[Ρ€Π°Π·ΠΌΠ΅Ρ€ + 5];
     
  2. Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· старого массива Π² Π½ΠΎΠ²Ρ‹ΠΉ массив (сохранив ΠΈΡ… Π½Π° ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ позициях). Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ†ΠΈΠΊΠ»Π° for.
     для (Ρ†Π΅Π»ΠΎΠ΅ я = 0; я
     
  3. Π£Π΄Π°Π»ΠΈΡ‚Π΅ старый массив — ΠΎΠ½ Π²Π°ΠΌ большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½! (Π”Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ твоя Мама ΠΈ вынСси мусор!)
     ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ [] список; // это удаляСт массив, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ «список» 
  4. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Π’Ρ‹ всС Π΅Ρ‰Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ массив вызывался «список» (Π΅Π³ΠΎ исходноС имя), поэтому ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ списка Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ адрСс.
     список = Ρ‚Π΅ΠΌΠΏ;
     

Π’ΠΎΡ‚ ΠΎΠ½ΠΎ! Массив списка Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° 5 большС, Ρ‡Π΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ, ΠΈ Π² Π½Π΅ΠΌ Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎ ΠΈ Π² исходном. Но сСйчас Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ мСсто для Π΅Ρ‰Π΅ 5 ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ².

ΠœΠΎΠ³Ρƒ Π»ΠΈ я ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ динамичСский массив Π½Π° языкС C?

  • 19.01.2016 #1

    Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ массива. НапримСр, Ссли я ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽ

    Код:

     int t[10]; 
    ΠΈ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ 11 Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² Π² массивС, ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ:

    Код:

     ΠΈΠ½Ρ‚ Π±[11]; 
    ΠΈ скопируйтС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ 10 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· a[] Π² b[].

    Но сСгодня Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ„ΠΎΡ€ΡƒΠΌΠ΅ я ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π», Ρ‡Ρ‚ΠΎ Π² C Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ динамичСскиС массивы.

    Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΈΠ· этого Π²Π΅Ρ€Π½ΠΎ?


  • 19.01.2016 #2

    «ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти»: достигаСтся Π² C с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ malloc(), calloc(), realloc() ΠΈ free(). Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ «stdlib.h», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

    Π’Π°ΠΌ слСдуСт ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ ΠΏΠΎ языку программирования C, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

    «ΠΠ²Ρ‚оматичСскиС массивы ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Π² ISO C99…», Π½ΠΎ это Π½Π΅ соотвСтствуСт ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π²Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ вашСго компилятора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ стандарт C99, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.


  • 19.01.2016 #3

    Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив с автоматичСским ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π² C. Π‘++ ΠΈΠΌΠ΅Π΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Ρ„ΠΎΡ€ΠΌΠ΅ std::vector. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ «динамичСскиС» массивы Π² C, начиная с C99. Но ΠΎΠ½ΠΈ Π½Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½Ρ‹, ΠΊΠ°ΠΊ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅. Они просто ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСтся Π²ΠΎ врСмя выполнСния, Π° Π½Π΅ Π²ΠΎ врСмя компиляции.

    Π§Ρ‚ΠΎ это Π·Π° странноС устройство?
    Когда я ΠΏΡ€ΠΈΠΊΠ°ΡΠ°ΡŽΡΡŒ ΠΊ Π½Π΅ΠΌΡƒ, ΠΎΠ½ ΠΈΠ·Π΄Π°Π΅Ρ‚ Π·Π²ΡƒΠΊ
    . Π£ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΈΠ±Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΈ ΠΈΠ·Π΄Π°ΡŽΡ‚ ΠΌΡƒΠ·Ρ‹ΠΊΡƒ
    Π§Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π° Π²Π΅Ρ‰ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я нашСл?


  • 19.01.2016 #4

    НСдинамичСский массив

    Код:

     int x[10] 
    Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΡ‚Π΅ΠΌ компиляции

    псСвдодинамичСского массива

    Код:

     int *x = malloc(sizeof(int) * y) 
    Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€, запустив (y Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π³Π΄Π΅-Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½)

    ДинамичСский «ΠΎΠ±ΡŠΠ΅ΠΊΡ‚»: связанный список. Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΎ структурах ΠΈ указатСлях Π½Π° структуры. Π’Π°ΠΌ Π»Π΅ΠΆΠΈΡ‚ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ваш вопрос.


  • 19.01.2016 #5

    ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ написал Elkvis

    … Но ΠΎΠ½ΠΈ Π½Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½Ρ‹ Π² Ρ‚ΠΎΠΌ смыслС, ΠΊΠ°ΠΊ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ …

    ВикипСдия Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚:

    ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ написал ВикипСдия

    Π’ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… Π½Π°ΡƒΠΊΠ°Ρ… динамичСский массив, Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹ΠΉ массив, массив с измСняСмым Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ, динамичСская Ρ‚Π°Π±Π»ΠΈΡ†Π°, измСняСмый массив ΠΈΠ»ΠΈ список массивов β€” это структура Π΄Π°Π½Π½Ρ‹Ρ… списка ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ доступом, которая позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹. Он поставляСтся со стандартными Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… соврСмСнных основных языках программирования.

    ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: https://en.wikipedia.org/wiki/Dynamic_array

    Π― знаю, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ элСмСнт Π² массив Π² Javascript, Ρ‚Π°ΠΌ это просто. (ΠœΠ΅Ρ‚ΠΎΠ΄ push() массива JavaScript)

    @rstanley : malloc(), calloc(), realloc() ΠΈ free() ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ для мСня Π² C. Насколько это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΌΠ½Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ динамичСский массив Π½Π° C, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ я упомянул Π² Ρ†ΠΈΡ‚Π°Ρ‚Π΅ ΠΈΠ· Π²ΠΈΠΊΠΈ. Π­Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ ΠΈΠ»ΠΈ просто соотвСтствуСт ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ части опрСдСлСния Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ?

    ПослСдний Ρ€Π°Π· Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ nerio; 19.01.2016 Π² 14:11.

  • 19.01.2016 #6

    ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Послано nerio

    ВикипСдия Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚:

    ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: https://en.wikipedia.org/wiki/Dynamic_array

    Π― знаю, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ элСмСнт Π² массив Π² Javascript, Ρ‚Π°ΠΌ это просто. ( ΠœΠ΅Ρ‚ΠΎΠ΄ JavaScript Array push() )

    @rstanley : malloc(), calloc(), realloc() ΠΈ free() всС Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° для изучСния Π² C. Насколько это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΌΠ½Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ динамичСский массив Π² C, Ρ‡Ρ‚ΠΎ соотвСтствуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ я упомянул Π² Ρ†ΠΈΡ‚Π°Ρ‚Π΅ ΠΈΠ· Π²ΠΈΠΊΠΈ. Π­Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ ΠΈΠ»ΠΈ просто соотвСтствуСт ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ части опрСдСлСния Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ?

    Π‘Π΅Π· написания ΠΊΠΎΠ΄Π° для вас:

    Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ malloc() для выдСлСния массива ΠΈΠ· Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 10 элСмСнтов Π² ΠΊΡƒΡ‡Π΅ (ΠΊΡƒΡ‡Π°: пространство памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ Π΅Ρ‰Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅). Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ мСсто для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов, Ссли Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅. Массив ΠΈΠ· 10 элСмСнтов довольно ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½.

    Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ массив ΠΏΠΎΠ·ΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ большС Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ realloc().

    Когда Π²Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ с пространством Π΄Π°Π½Π½Ρ‹Ρ…, Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ free(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ пространство памяти Π² ΠΊΡƒΡ‡Ρƒ для ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

  • ΠžΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

    Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

    Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *